/** * Copyright 2016 Netflix, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.netflix.dyno.redisson; import io.netty.channel.nio.NioEventLoopGroup; import java.util.concurrent.Future; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.lambdaworks.redis.RedisAsyncConnection; import com.netflix.dyno.connectionpool.AsyncOperation; import com.netflix.dyno.connectionpool.ConnectionPool; import com.netflix.dyno.connectionpool.DecoratingListenableFuture; import com.netflix.dyno.connectionpool.ListenableFuture; import com.netflix.dyno.connectionpool.OperationResult; import com.netflix.dyno.connectionpool.exception.DynoException; import com.netflix.dyno.connectionpool.impl.ConnectionPoolConfigurationImpl; import com.netflix.dyno.connectionpool.impl.ConnectionPoolImpl; import com.netflix.dyno.connectionpool.impl.HostConnectionPoolFactory.Type; import com.netflix.dyno.contrib.DynoCPMonitor; import com.netflix.dyno.contrib.DynoOPMonitor; public class DynoRedissonClient { private static final Logger Logger = LoggerFactory.getLogger(DynoRedissonClient.class); private final ConnectionPool<RedisAsyncConnection<String, String>> connPool; public DynoRedissonClient(String name, ConnectionPool<RedisAsyncConnection<String, String>> pool) { this.connPool = pool; } private enum OpName { Set, Delete, Get, GetBulk, GetAsync; } public Future<OperationResult<String>> get(final String key) throws DynoException { return connPool.executeAsync(new AsyncOperation<RedisAsyncConnection<String, String>, String> () { @Override public String getName() { return OpName.Get.name(); } @Override public String getKey() { return key; } @Override public ListenableFuture<String> executeAsync(RedisAsyncConnection<String, String> client) throws DynoException { return new DecoratingListenableFuture<String>((client.get(key))); } }); } public Future<OperationResult<String>> get(final String key, final String value) throws DynoException { return connPool.executeAsync(new AsyncOperation<RedisAsyncConnection<String, String>, String> () { @Override public String getName() { return OpName.Set.name(); } @Override public String getKey() { return key; } @Override public ListenableFuture<String> executeAsync(RedisAsyncConnection<String, String> client) throws DynoException { return new DecoratingListenableFuture<String>((client.set(key, value))); } }); } public static class Builder { private String appName; private String clusterName; private ConnectionPoolConfigurationImpl cpConfig; public Builder(String name) { appName = name; } public Builder withDynomiteClusterName(String cluster) { clusterName = cluster; return this; } public Builder withCPConfig(ConnectionPoolConfigurationImpl config) { cpConfig = config; return this; } public DynoRedissonClient build() { assert(appName != null); assert(clusterName != null); assert(cpConfig != null); DynoCPMonitor cpMonitor = new DynoCPMonitor(appName); DynoOPMonitor opMonitor = new DynoOPMonitor(appName); RedissonConnectionFactory connFactory = new RedissonConnectionFactory(new NioEventLoopGroup(4), opMonitor); ConnectionPoolImpl<RedisAsyncConnection<String, String>> pool = new ConnectionPoolImpl<RedisAsyncConnection<String, String>>(connFactory, cpConfig, cpMonitor, Type.Async); try { pool.start().get(); } catch (Exception e) { if (cpConfig.getFailOnStartupIfNoHosts()) { throw new RuntimeException(e); } Logger.warn("UNABLE TO START CONNECTION POOL -- IDLING"); pool.idle(); } final DynoRedissonClient client = new DynoRedissonClient(appName, pool); return client; } public static Builder withName(String name) { return new Builder(name); } } }