diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java
index 8487c05a7f..993be834da 100644
--- a/src/main/java/redis/clients/jedis/BinaryClient.java
+++ b/src/main/java/redis/clients/jedis/BinaryClient.java
@@ -40,8 +40,8 @@ public class BinaryClient extends Connection {
private boolean isInMulti;
- private String user;
- private String password;
+ @Deprecated private String user;
+ @Deprecated private String password;
private int db;
@@ -51,6 +51,12 @@ public BinaryClient() {
super();
}
+ /**
+ * @param host
+ * @deprecated This constructor will be removed in future. It can be replaced with
+ * {@link #BinaryClient(java.lang.String, int)} with the host and {@link Protocol#DEFAULT_PORT}.
+ */
+ @Deprecated
public BinaryClient(final String host) {
super(host);
}
@@ -59,16 +65,30 @@ public BinaryClient(final String host, final int port) {
super(host, port);
}
+ /**
+ * @deprecated This constructor will be removed in future. Use
+ * {@link #BinaryClient(redis.clients.jedis.HostAndPort, redis.clients.jedis.JedisClientConfig)}.
+ */
+ @Deprecated
public BinaryClient(final String host, final int port, final boolean ssl) {
super(host, port, ssl);
}
+ /**
+ * @deprecated This constructor will be removed in future. Use
+ * {@link #BinaryClient(redis.clients.jedis.HostAndPort, redis.clients.jedis.JedisClientConfig)}.
+ */
+ @Deprecated
public BinaryClient(final String host, final int port, final boolean ssl,
final SSLSocketFactory sslSocketFactory, final SSLParameters sslParameters,
final HostnameVerifier hostnameVerifier) {
super(host, port, ssl, sslSocketFactory, sslParameters, hostnameVerifier);
}
+ public BinaryClient(final HostAndPort hostPort, final JedisClientConfig clientConfig) {
+ super(hostPort, clientConfig);
+ }
+
public BinaryClient(final JedisSocketFactory jedisSocketFactory) {
super(jedisSocketFactory);
}
@@ -81,31 +101,39 @@ public boolean isInWatch() {
return isInWatch;
}
- private byte[][] joinParameters(byte[] first, byte[][] rest) {
- byte[][] result = new byte[rest.length + 1][];
- result[0] = first;
- System.arraycopy(rest, 0, result, 1, rest.length);
- return result;
- }
-
- private byte[][] joinParameters(byte[] first, byte[] second, byte[][] rest) {
- byte[][] result = new byte[rest.length + 2][];
- result[0] = first;
- result[1] = second;
- System.arraycopy(rest, 0, result, 2, rest.length);
- return result;
+ /**
+ * @param user
+ * @deprecated This method will be removed in future. Because this class will be restricted from
+ * holding any user data.
+ */
+ @Deprecated
+ public void setUser(final String user) {
+ this.user = user;
}
- public void setUser(final String user) { this.user = user; }
-
+ /**
+ * @param password
+ * @deprecated This method will be removed in future. Because this class will be restricted from
+ * holding any user data.
+ */
+ @Deprecated
public void setPassword(final String password) {
this.password = password;
}
+
+ /**
+ * This method should be called only after a successful SELECT command.
+ * @param db
+ */
public void setDb(int db) {
this.db = db;
}
+ public int getDB() {
+ return db;
+ }
+
@Override
public void connect() {
if (!isConnected()) {
@@ -124,6 +152,25 @@ public void connect() {
}
}
+ @Override
+ public void disconnect() {
+ db = 0;
+ super.disconnect();
+ }
+
+ @Override
+ public void close() {
+ db = 0;
+ super.close();
+ }
+
+ public void resetState() {
+ if (isInWatch()) {
+ unwatch();
+ getStatusCodeReply();
+ }
+ }
+
public void ping() {
sendCommand(PING);
}
@@ -973,29 +1020,6 @@ public void getrange(final byte[] key, final long startOffset, final long endOff
sendCommand(GETRANGE, key, toByteArray(startOffset), toByteArray(endOffset));
}
- public int getDB() {
- return db;
- }
-
- @Override
- public void disconnect() {
- db = 0;
- super.disconnect();
- }
-
- @Override
- public void close() {
- db = 0;
- super.close();
- }
-
- public void resetState() {
- if (isInWatch()) {
- unwatch();
- getStatusCodeReply();
- }
- }
-
public void eval(final byte[] script, final byte[] keyCount, final byte[][] params) {
sendCommand(EVAL, joinParameters(script, keyCount, params));
}
@@ -1654,4 +1678,18 @@ public void xinfoConsumers (byte[] key, byte[] group) {
sendCommand(XINFO,Keyword.CONSUMERS.getRaw(),key,group);
}
+ private static byte[][] joinParameters(byte[] first, byte[][] rest) {
+ byte[][] result = new byte[rest.length + 1][];
+ result[0] = first;
+ System.arraycopy(rest, 0, result, 1, rest.length);
+ return result;
+ }
+
+ private static byte[][] joinParameters(byte[] first, byte[] second, byte[][] rest) {
+ byte[][] result = new byte[rest.length + 2][];
+ result[0] = first;
+ result[1] = second;
+ System.arraycopy(rest, 0, result, 2, rest.length);
+ return result;
+ }
}
diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java
index 28197129cb..a43a7df63c 100644
--- a/src/main/java/redis/clients/jedis/BinaryJedis.java
+++ b/src/main/java/redis/clients/jedis/BinaryJedis.java
@@ -43,7 +43,7 @@
public class BinaryJedis implements BasicCommands, BinaryJedisCommands, MultiKeyBinaryCommands,
AdvancedBinaryJedisCommands, BinaryScriptingCommands, Closeable {
- protected Client client = null;
+ protected final Client client;
protected Transaction transaction = null;
protected Pipeline pipeline = null;
protected static final byte[][] DUMMY_ARRAY = new byte[0][];
@@ -52,31 +52,85 @@ public BinaryJedis() {
client = new Client();
}
- public BinaryJedis(final String host) {
- URI uri = URI.create(host);
+ /**
+ * @deprecated This constructor will not support a host string in future. It will accept only a
+ * uri string. {@link JedisURIHelper#isValid(java.net.URI)} can used before this. If this
+ * constructor was being used with a host, it can be replaced with
+ * {@link #BinaryJedis(java.lang.String, int)} with the host and {@link Protocol#DEFAULT_PORT}.
+ * @param uriString
+ */
+ @Deprecated
+ public BinaryJedis(final String uriString) {
+ URI uri = URI.create(uriString);
if (JedisURIHelper.isValid(uri)) {
- initializeClientFromURI(uri);
+ client = createClientFromURI(uri);
+ initializeFromURI(uri);
} else {
- client = new Client(host);
+ client = new Client(uriString);
}
}
public BinaryJedis(final HostAndPort hp) {
- this(hp.getHost(), hp.getPort());
+ this(hp, DefaultJedisClientConfig.builder().build());
}
public BinaryJedis(final String host, final int port) {
client = new Client(host, port);
}
+ public BinaryJedis(final String host, final int port, final JedisClientConfig config) {
+ this(new HostAndPort(host, port), config);
+ }
+
+ public BinaryJedis(final HostAndPort hostPort, final JedisClientConfig config) {
+ client = new Client(hostPort, config);
+ initializeFromClientConfig(config);
+ }
+
+ private void initializeFromClientConfig(JedisClientConfig config) {
+ try {
+ connect();
+ String password = config.getPassword();
+ if (password != null) {
+ String user = config.getUser();
+ if (user != null) {
+ auth(user, password);
+ } else {
+ auth(password);
+ }
+ }
+ int dbIndex = config.getDatabase();
+ if (dbIndex > 0) {
+ select(dbIndex);
+ }
+ String clientName = config.getClientName();
+ if (clientName != null) {
+ // TODO: need to figure out something without encoding
+ clientSetname(redis.clients.jedis.util.SafeEncoder.encode(clientName));
+ }
+ } catch (JedisException je) {
+ try {
+ if (isConnected()) {
+ quit();
+ }
+ disconnect();
+ } catch (Exception e) {
+ //
+ }
+ throw je;
+ }
+ }
+
public BinaryJedis(final String host, final int port, final boolean ssl) {
- client = new Client(host, port, ssl);
+ this(host, port, DefaultJedisClientConfig.builder().withSsl(ssl).build());
}
public BinaryJedis(final String host, final int port, final boolean ssl,
final SSLSocketFactory sslSocketFactory, final SSLParameters sslParameters,
final HostnameVerifier hostnameVerifier) {
- client = new Client(host, port, ssl, sslSocketFactory, sslParameters, hostnameVerifier);
+ this(host, port, DefaultJedisClientConfig.builder().withSsl(ssl)
+ .withSslSocketFactory(sslSocketFactory).withSslParameters(sslParameters)
+ .withHostnameVerifier(hostnameVerifier).build());
}
public BinaryJedis(final String host, final int port, final int timeout) {
@@ -95,62 +149,61 @@ public BinaryJedis(final String host, final int port, final int timeout, final b
public BinaryJedis(final String host, final int port, final int connectionTimeout,
final int soTimeout) {
- client = new Client(host, port);
- client.setConnectionTimeout(connectionTimeout);
- client.setSoTimeout(soTimeout);
+ this(host, port, DefaultJedisClientConfig.builder()
+ .withConnectionTimeout(connectionTimeout).withSoTimeout(soTimeout).build());
}
public BinaryJedis(final String host, final int port, final int connectionTimeout,
final int soTimeout, final int infiniteSoTimeout) {
- client = new Client(host, port);
- client.setConnectionTimeout(connectionTimeout);
- client.setSoTimeout(soTimeout);
- client.setInfiniteSoTimeout(infiniteSoTimeout);
+ this(host, port, DefaultJedisClientConfig.builder()
+ .withConnectionTimeout(connectionTimeout).withSoTimeout(soTimeout)
+ .withInfiniteSoTimeout(infiniteSoTimeout).build());
}
public BinaryJedis(final String host, final int port, final int connectionTimeout,
final int soTimeout, final boolean ssl) {
- client = new Client(host, port, ssl);
- client.setConnectionTimeout(connectionTimeout);
- client.setSoTimeout(soTimeout);
+ this(host, port, DefaultJedisClientConfig.builder()
+ .withConnectionTimeout(connectionTimeout).withSoTimeout(soTimeout).withSsl(ssl).build());
}
public BinaryJedis(final String host, final int port, final int connectionTimeout,
final int soTimeout, final boolean ssl, final SSLSocketFactory sslSocketFactory,
final SSLParameters sslParameters, final HostnameVerifier hostnameVerifier) {
- client = new Client(host, port, ssl, sslSocketFactory, sslParameters, hostnameVerifier);
- client.setConnectionTimeout(connectionTimeout);
- client.setSoTimeout(soTimeout);
+ this(host, port, DefaultJedisClientConfig.builder()
+ .withConnectionTimeout(connectionTimeout).withSoTimeout(soTimeout).withSsl(ssl)
+ .withSslSocketFactory(sslSocketFactory).withSslParameters(sslParameters)
+ .withHostnameVerifier(hostnameVerifier).build());
}
public BinaryJedis(final String host, final int port, final int connectionTimeout,
final int soTimeout, final int infiniteSoTimeout, final boolean ssl,
final SSLSocketFactory sslSocketFactory, final SSLParameters sslParameters,
final HostnameVerifier hostnameVerifier) {
- client = new Client(host, port, ssl, sslSocketFactory, sslParameters, hostnameVerifier);
- client.setConnectionTimeout(connectionTimeout);
- client.setSoTimeout(soTimeout);
- client.setInfiniteSoTimeout(infiniteSoTimeout);
+ this(host, port, DefaultJedisClientConfig.builder()
+ .withConnectionTimeout(connectionTimeout).withSoTimeout(soTimeout)
+ .withInfiniteSoTimeout(infiniteSoTimeout).withSsl(ssl)
+ .withSslSocketFactory(sslSocketFactory).withSslParameters(sslParameters)
+ .withHostnameVerifier(hostnameVerifier).build());
}
public BinaryJedis(final JedisShardInfo shardInfo) {
- client = new Client(shardInfo.getHost(), shardInfo.getPort(), shardInfo.getSsl(),
- shardInfo.getSslSocketFactory(), shardInfo.getSslParameters(),
- shardInfo.getHostnameVerifier());
- client.setConnectionTimeout(shardInfo.getConnectionTimeout());
- client.setSoTimeout(shardInfo.getSoTimeout());
- client.setUser(shardInfo.getUser());
- client.setPassword(shardInfo.getPassword());
- client.setDb(shardInfo.getDb());
+ this(shardInfo.getHost(), shardInfo.getPort(), DefaultJedisClientConfig.builder()
+ .withConnectionTimeout(shardInfo.getConnectionTimeout()).withSoTimeout(shardInfo.getSoTimeout())
+ .withUser(shardInfo.getUser()).withPassword(shardInfo.getPassword()).withDatabse(shardInfo.getDb())
+ .withSsl(shardInfo.getSsl()).withSslSocketFactory(shardInfo.getSslSocketFactory())
+ .withSslParameters(shardInfo.getSslParameters()).withHostnameVerifier(shardInfo.getHostnameVerifier()).build());
}
public BinaryJedis(URI uri) {
- initializeClientFromURI(uri);
+ client = createClientFromURI(uri);
+ initializeFromURI(uri);
}
public BinaryJedis(URI uri, final SSLSocketFactory sslSocketFactory,
final SSLParameters sslParameters, final HostnameVerifier hostnameVerifier) {
- initializeClientFromURI(uri, sslSocketFactory, sslParameters, hostnameVerifier);
+ this(uri, DefaultJedisClientConfig.builder()
+ .withSslSocketFactory(sslSocketFactory).withSslParameters(sslParameters)
+ .withHostnameVerifier(hostnameVerifier).build());
}
public BinaryJedis(final URI uri, final int timeout) {
@@ -163,65 +216,72 @@ public BinaryJedis(final URI uri, final int timeout, final SSLSocketFactory sslS
}
public BinaryJedis(final URI uri, final int connectionTimeout, final int soTimeout) {
- initializeClientFromURI(uri);
- client.setConnectionTimeout(connectionTimeout);
- client.setSoTimeout(soTimeout);
+ this(uri, DefaultJedisClientConfig.builder()
+ .withConnectionTimeout(connectionTimeout).withSoTimeout(soTimeout).build());
}
public BinaryJedis(final URI uri, final int connectionTimeout, final int soTimeout,
final SSLSocketFactory sslSocketFactory,final SSLParameters sslParameters,
final HostnameVerifier hostnameVerifier) {
- initializeClientFromURI(uri, sslSocketFactory, sslParameters, hostnameVerifier);
- client.setConnectionTimeout(connectionTimeout);
- client.setSoTimeout(soTimeout);
+ this(uri, DefaultJedisClientConfig.builder()
+ .withConnectionTimeout(connectionTimeout).withSoTimeout(soTimeout)
+ .withSslSocketFactory(sslSocketFactory).withSslParameters(sslParameters)
+ .withHostnameVerifier(hostnameVerifier).build());
}
public BinaryJedis(final URI uri, final int connectionTimeout, final int soTimeout,
final int infiniteSoTimeout, final SSLSocketFactory sslSocketFactory,
final SSLParameters sslParameters, final HostnameVerifier hostnameVerifier) {
- initializeClientFromURI(uri, sslSocketFactory, sslParameters, hostnameVerifier);
- client.setConnectionTimeout(connectionTimeout);
- client.setSoTimeout(soTimeout);
- client.setInfiniteSoTimeout(infiniteSoTimeout);
+ this(uri, DefaultJedisClientConfig.builder()
+ .withConnectionTimeout(connectionTimeout).withSoTimeout(soTimeout)
+ .withInfiniteSoTimeout(infiniteSoTimeout).withSslSocketFactory(sslSocketFactory)
+ .withSslParameters(sslParameters).withHostnameVerifier(hostnameVerifier).build());
}
- public BinaryJedis(final JedisSocketFactory jedisSocketFactory) {
- client = new Client(jedisSocketFactory);
- }
-
- private void initializeClientFromURI(URI uri) {
- initializeClientFromURI(uri, null, null, null);
- }
-
- private void initializeClientFromURI(URI uri, final SSLSocketFactory sslSocketFactory,
- final SSLParameters sslParameters, final HostnameVerifier hostnameVerifier) {
+ public BinaryJedis(final URI uri, JedisClientConfig config) {
if (!JedisURIHelper.isValid(uri)) {
- throw new InvalidURIException(String.format(
- "Cannot open Redis connection due invalid URI. %s", uri.toString()));
+ throw new InvalidURIException(String.format("Cannot open Redis connection due invalid URI \"%s\".", uri.toString()));
}
+ client = new Client(new HostAndPort(uri.getHost(), uri.getPort()),
+ DefaultJedisClientConfig.builder().withConnectionTimeout(config.getConnectionTimeout())
+ .withSoTimeout(config.getSoTimeout()).withInfiniteSoTimeout(config.getInfiniteSoTimeout())
+ .withUser(JedisURIHelper.getUser(uri)).withPassword(JedisURIHelper.getPassword(uri))
+ .withDatabse(JedisURIHelper.getDBIndex(uri)).withClientName(config.getClientName())
+ .withSsl(JedisURIHelper.isRedisSSLScheme(uri))
+ .withSslSocketFactory(config.getSslSocketFactory())
+ .withSslParameters(config.getSslParameters())
+ .withHostnameVerifier(config.getHostnameVerifier()).build());
+ initializeFromURI(uri);
+ }
+
+ private static Client createClientFromURI(URI uri) {
+ if (!JedisURIHelper.isValid(uri)) {
+ throw new InvalidURIException(String.format("Cannot open Redis connection due invalid URI \"%s\".", uri.toString()));
+ }
+ return new Client(new HostAndPort(uri.getHost(), uri.getPort()),
+ DefaultJedisClientConfig.builder().withSsl(JedisURIHelper.isRedisSSLScheme(uri)).build());
+ }
- client = new Client(uri.getHost(), uri.getPort(), JedisURIHelper.isRedisSSLScheme(uri),
- sslSocketFactory, sslParameters, hostnameVerifier);
-
+ private void initializeFromURI(URI uri) {
String password = JedisURIHelper.getPassword(uri);
if (password != null) {
String user = JedisURIHelper.getUser(uri);
- if (user == null) {
- client.auth(password);
+ if (user != null) {
+ auth(user, password);
} else {
- client.auth(user, password);
+ auth(password);
}
- client.getStatusCodeReply();
}
-
int dbIndex = JedisURIHelper.getDBIndex(uri);
if (dbIndex > 0) {
- client.select(dbIndex);
- client.getStatusCodeReply();
- client.setDb(dbIndex);
+ select(dbIndex);
}
}
+ public BinaryJedis(final JedisSocketFactory jedisSocketFactory) {
+ client = new Client(jedisSocketFactory);
+ }
+
public boolean isConnected() {
return client.isConnected();
}
@@ -230,6 +290,44 @@ public boolean isBroken() {
return client.isBroken();
}
+ public void connect() {
+ client.connect();
+ }
+
+ public void disconnect() {
+ client.disconnect();
+ }
+
+ public void resetState() {
+ if (isConnected()) {
+ if (transaction != null) {
+ transaction.close();
+ }
+
+ if (pipeline != null) {
+ pipeline.close();
+ }
+
+ client.resetState();
+ }
+
+ transaction = null;
+ pipeline = null;
+ }
+
+ @Override
+ public void close() {
+ client.close();
+ }
+
+ @Override
+ public int getDB() {
+ return client.getDB();
+ }
+
+ /**
+ * @return PONG
+ */
@Override
public String ping() {
checkIsInMultiOrPipeline();
@@ -238,7 +336,7 @@ public String ping() {
}
/**
- * Works same as ping() but returns argument message instead of PONG.
+ * Works same as {@link #ping()} but returns argument message instead of PONG.
* @param message
* @return message
*/
@@ -1454,6 +1552,7 @@ public Long lpos(final byte[] key, final byte[] element, final LPosParams params
* @see #lpos(byte[], byte[], LPosParams, long)
* @param key
* @param element
+ * @param params
* @param count
* @return Returns value will be a list containing position of the matching elements inside the list.
*/
@@ -2059,31 +2158,6 @@ protected void checkIsInMultiOrPipeline() {
}
}
- public void connect() {
- client.connect();
- }
-
- public void disconnect() {
- client.disconnect();
- }
-
- public void resetState() {
- if (isConnected()) {
- if (transaction != null) {
- transaction.close();
- }
-
- if (pipeline != null) {
- pipeline.close();
- }
-
- client.resetState();
- }
-
- transaction = null;
- pipeline = null;
- }
-
@Override
public String watch(final byte[]... keys) {
checkIsInMultiOrPipeline();
@@ -2098,11 +2172,6 @@ public String unwatch() {
return client.getStatusCodeReply();
}
- @Override
- public void close() {
- client.close();
- }
-
/**
* Sort a Set or a List.
*
@@ -3491,11 +3560,6 @@ public void psubscribe(BinaryJedisPubSub jedisPubSub, final byte[]... patterns)
}
}
- @Override
- public int getDB() {
- return client.getDB();
- }
-
/**
* Evaluates scripts using the Lua interpreter built into Redis starting from version 2.6.0.
*
diff --git a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java
index e48188ef1a..3afe10473b 100644
--- a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java
+++ b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java
@@ -84,21 +84,32 @@ public BinaryJedisCluster(Set jedisClusterNode, int connectionTimeo
this(jedisClusterNode, connectionTimeout, soTimeout, maxAttempts, user, password, clientName, poolConfig, ssl, null, null, null, null);
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public BinaryJedisCluster(Set jedisClusterNode, int connectionTimeout, int soTimeout, int maxAttempts, String password, String clientName, GenericObjectPoolConfig poolConfig,
boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters, HostnameVerifier hostnameVerifier, JedisClusterHostAndPortMap hostAndPortMap) {
this(jedisClusterNode, connectionTimeout, soTimeout, maxAttempts, null, password, clientName,
poolConfig, ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMap);
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public BinaryJedisCluster(Set jedisClusterNode, int connectionTimeout, int soTimeout,
int maxAttempts, String user, String password, String clientName, GenericObjectPoolConfig poolConfig,
boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
HostnameVerifier hostnameVerifier, JedisClusterHostAndPortMap hostAndPortMap) {
- this.connectionHandler = new JedisSlotBasedConnectionHandler(jedisClusterNode, poolConfig,
- connectionTimeout, soTimeout, user, password, clientName, ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMap);
- this.maxAttempts = maxAttempts;
+ this(jedisClusterNode, connectionTimeout, soTimeout, 0, maxAttempts, user, password, clientName, poolConfig,
+ ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMap);
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public BinaryJedisCluster(Set jedisClusterNode, int connectionTimeout, int soTimeout,
int infiniteSoTimeout, int maxAttempts, String user, String password, String clientName, GenericObjectPoolConfig poolConfig,
boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters, HostnameVerifier hostnameVerifier, JedisClusterHostAndPortMap hostAndPortMap) {
@@ -107,6 +118,12 @@ public BinaryJedisCluster(Set jedisClusterNode, int connectionTimeo
this.maxAttempts = maxAttempts;
}
+ public BinaryJedisCluster(Set jedisClusterNode, JedisClientConfig clientConfig,
+ int maxAttempts, GenericObjectPoolConfig poolConfig) {
+ this.connectionHandler = new JedisSlotBasedConnectionHandler(jedisClusterNode, poolConfig, clientConfig);
+ this.maxAttempts = maxAttempts;
+ }
+
@Override
public void close() {
if (connectionHandler != null) {
diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java
index 91ce04b072..3343562e3b 100644
--- a/src/main/java/redis/clients/jedis/Client.java
+++ b/src/main/java/redis/clients/jedis/Client.java
@@ -29,6 +29,12 @@ public Client() {
super();
}
+ /**
+ * @param host
+ * @deprecated This constructor will be removed in future. It can be replaced with
+ * {@link #Client(java.lang.String, int)} with the host and {@link Protocol#DEFAULT_PORT}.
+ */
+ @Deprecated
public Client(final String host) {
super(host);
}
@@ -37,16 +43,28 @@ public Client(final String host, final int port) {
super(host, port);
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public Client(final String host, final int port, final boolean ssl) {
super(host, port, ssl);
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public Client(final String host, final int port, final boolean ssl,
final SSLSocketFactory sslSocketFactory, final SSLParameters sslParameters,
final HostnameVerifier hostnameVerifier) {
super(host, port, ssl, sslSocketFactory, sslParameters, hostnameVerifier);
}
+ public Client(final HostAndPort hostPort, final JedisClientConfig clientConfig) {
+ super(hostPort, clientConfig);
+ }
+
public Client(final JedisSocketFactory jedisSocketFactory) {
super(jedisSocketFactory);
}
diff --git a/src/main/java/redis/clients/jedis/Connection.java b/src/main/java/redis/clients/jedis/Connection.java
index 6d533c549a..20abce5b47 100644
--- a/src/main/java/redis/clients/jedis/Connection.java
+++ b/src/main/java/redis/clients/jedis/Connection.java
@@ -23,38 +23,62 @@ public class Connection implements Closeable {
private static final byte[][] EMPTY_ARGS = new byte[0][];
- private JedisSocketFactory jedisSocketFactory;
+ private boolean socketParamModified = false; // for backward compatibility
+ private JedisSocketFactory socketFactory; // TODO: sould be final
private Socket socket;
private RedisOutputStream outputStream;
private RedisInputStream inputStream;
+ private int soTimeout = Protocol.DEFAULT_TIMEOUT;
private int infiniteSoTimeout = 0;
private boolean broken = false;
public Connection() {
- this(Protocol.DEFAULT_HOST);
+ this(Protocol.DEFAULT_HOST, Protocol.DEFAULT_PORT);
}
+ /**
+ * @param host
+ * @deprecated This constructor will be removed in future. It can be replaced with
+ * {@link #Connection(java.lang.String, int)} with the host and {@link Protocol#DEFAULT_PORT}.
+ */
+ @Deprecated
public Connection(final String host) {
this(host, Protocol.DEFAULT_PORT);
}
public Connection(final String host, final int port) {
- this(host, port, false);
+ this(new HostAndPort(host, port), DefaultJedisClientConfig.builder().build());
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public Connection(final String host, final int port, final boolean ssl) {
- this(host, port, ssl, null, null, null);
+ this(new HostAndPort(host, port), DefaultJedisClientConfig.builder().withSsl(ssl).build());
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public Connection(final String host, final int port, final boolean ssl,
SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
HostnameVerifier hostnameVerifier) {
- this(new DefaultJedisSocketFactory(host, port, Protocol.DEFAULT_TIMEOUT,
- Protocol.DEFAULT_TIMEOUT, ssl, sslSocketFactory, sslParameters, hostnameVerifier));
+ this(new HostAndPort(host, port), DefaultJedisClientConfig.builder().withSsl(ssl)
+ .withSslSocketFactory(sslSocketFactory).withSslParameters(sslParameters)
+ .withHostnameVerifier(hostnameVerifier).build());
+ }
+
+ public Connection(final HostAndPort hostAndPort, final JedisClientConfig clientConfig) {
+ this(new DefaultJedisSocketFactory(hostAndPort, clientConfig));
+ this.soTimeout = clientConfig.getSoTimeout();
+ this.infiniteSoTimeout = clientConfig.getInfiniteSoTimeout();
}
public Connection(final JedisSocketFactory jedisSocketFactory) {
- this.jedisSocketFactory = jedisSocketFactory;
+ this.socketFactory = jedisSocketFactory;
+ this.soTimeout = jedisSocketFactory.getSoTimeout();
}
public Socket getSocket() {
@@ -62,19 +86,34 @@ public Socket getSocket() {
}
public int getConnectionTimeout() {
- return jedisSocketFactory.getConnectionTimeout();
+ return socketFactory.getConnectionTimeout();
}
public int getSoTimeout() {
- return jedisSocketFactory.getSoTimeout();
+ return soTimeout;
}
+ /**
+ * @param connectionTimeout
+ * @deprecated This method is not supported anymore and is kept for backward compatibility. It
+ * will be removed in future.
+ */
+ @Deprecated
public void setConnectionTimeout(int connectionTimeout) {
- jedisSocketFactory.setConnectionTimeout(connectionTimeout);
+ socketFactory.setConnectionTimeout(connectionTimeout);
}
public void setSoTimeout(int soTimeout) {
- jedisSocketFactory.setSoTimeout(soTimeout);
+ socketFactory.setSoTimeout(soTimeout);
+ this.soTimeout = soTimeout;
+ if (this.socket != null) {
+ try {
+ this.socket.setSoTimeout(soTimeout);
+ } catch (SocketException ex) {
+ broken = true;
+ throw new JedisConnectionException(ex);
+ }
+ }
}
public void setInfiniteSoTimeout(int infiniteSoTimeout) {
@@ -95,7 +134,7 @@ public void setTimeoutInfinite() {
public void rollbackTimeout() {
try {
- socket.setSoTimeout(jedisSocketFactory.getSoTimeout());
+ socket.setSoTimeout(socketFactory.getSoTimeout());
} catch (SocketException ex) {
broken = true;
throw new JedisConnectionException(ex);
@@ -142,32 +181,57 @@ public void sendCommand(final ProtocolCommand cmd, final byte[]... args) {
}
public String getHost() {
- return jedisSocketFactory.getHost();
+ return socketFactory.getHost();
}
+ /**
+ * @param host
+ * @deprecated This method will be removed in future.
+ */
+ @Deprecated
public void setHost(final String host) {
- jedisSocketFactory.setHost(host);
+ socketFactory.setHost(host);
+ socketParamModified = true;
}
public int getPort() {
- return jedisSocketFactory.getPort();
+ return socketFactory.getPort();
}
+ /**
+ * @param port
+ * @deprecated This method will be removed in future.
+ */
+ @Deprecated
public void setPort(final int port) {
- jedisSocketFactory.setPort(port);
+ socketFactory.setPort(port);
+ socketParamModified = true;
}
- public void connect() {
+ public void connect() throws JedisConnectionException {
+ if (socketParamModified) { // this is only for backward compatibility
+ try {
+ disconnect();
+ } catch(Exception e) {
+ // swallow
+ }
+ }
if (!isConnected()) {
try {
- socket = jedisSocketFactory.createSocket();
+ socket = socketFactory.createSocket();
outputStream = new RedisOutputStream(socket.getOutputStream());
inputStream = new RedisInputStream(socket.getInputStream());
- } catch (IOException ex) {
+ } catch (IOException ioe) {
+ broken = true;
+ throw new JedisConnectionException("Failed to create input/output stream", ioe);
+ } catch (JedisConnectionException jce) {
broken = true;
- throw new JedisConnectionException("Failed connecting to "
- + jedisSocketFactory.getDescription(), ex);
+ throw jce;
+ } finally {
+ if (broken) {
+ IOUtils.closeQuietly(socket);
+ }
}
}
}
diff --git a/src/main/java/redis/clients/jedis/DefaultJedisClientConfig.java b/src/main/java/redis/clients/jedis/DefaultJedisClientConfig.java
new file mode 100644
index 0000000000..6db777e97d
--- /dev/null
+++ b/src/main/java/redis/clients/jedis/DefaultJedisClientConfig.java
@@ -0,0 +1,201 @@
+package redis.clients.jedis;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLParameters;
+import javax.net.ssl.SSLSocketFactory;
+
+public final class DefaultJedisClientConfig implements JedisClientConfig {
+
+ private final int connectionTimeout;
+ private final int soTimeout;
+ private final int infiniteSoTimeout;
+
+ private final String user;
+ private final String password;
+ private final int database;
+ private final String clientName;
+
+ private final boolean ssl;
+ private final SSLSocketFactory sslSocketFactory;
+ private final SSLParameters sslParameters;
+ private final HostnameVerifier hostnameVerifier;
+
+ private final HostAndPortMapper hostAndPortMapper;
+
+ private DefaultJedisClientConfig(int connectionTimeout, int soTimeout, int infiniteSoTimeout,
+ String user, String password, int database, String clientName,
+ boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
+ HostnameVerifier hostnameVerifier, HostAndPortMapper hostAndPortMapper) {
+ this.connectionTimeout = connectionTimeout;
+ this.soTimeout = soTimeout;
+ this.infiniteSoTimeout = infiniteSoTimeout;
+ this.user = user;
+ this.password = password;
+ this.database = database;
+ this.clientName = clientName;
+ this.ssl = ssl;
+ this.sslSocketFactory = sslSocketFactory;
+ this.sslParameters = sslParameters;
+ this.hostnameVerifier = hostnameVerifier;
+ this.hostAndPortMapper = hostAndPortMapper;
+ }
+
+ @Override
+ public int getConnectionTimeout() {
+ return connectionTimeout;
+ }
+
+ @Override
+ public int getSoTimeout() {
+ return soTimeout;
+ }
+
+ @Override
+ public int getInfiniteSoTimeout() {
+ return infiniteSoTimeout;
+ }
+
+ @Override
+ public String getUser() {
+ return user;
+ }
+
+ @Override
+ public String getPassword() {
+ return password;
+ }
+
+ @Override
+ public int getDatabase() {
+ return database;
+ }
+
+ @Override
+ public String getClientName() {
+ return clientName;
+ }
+
+ @Override
+ public boolean isSsl() {
+ return ssl;
+ }
+
+ @Override
+ public SSLSocketFactory getSslSocketFactory() {
+ return sslSocketFactory;
+ }
+
+ @Override
+ public SSLParameters getSslParameters() {
+ return sslParameters;
+ }
+
+ @Override
+ public HostnameVerifier getHostnameVerifier() {
+ return hostnameVerifier;
+ }
+
+ @Override
+ public HostAndPortMapper getHostAndPortMapper() {
+ return hostAndPortMapper;
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public static class Builder {
+
+ private int connectionTimeout = Protocol.DEFAULT_TIMEOUT;
+ private int soTimeout = Protocol.DEFAULT_TIMEOUT;
+ private int infiniteSoTimeout = 0;
+
+ private String user = null;
+ private String password = null;
+ private int databse = Protocol.DEFAULT_DATABASE;
+ private String clientName = null;
+
+ private boolean ssl = false;
+ private SSLSocketFactory sslSocketFactory = null;
+ private SSLParameters sslParameters = null;
+ private HostnameVerifier hostnameVerifier = null;
+
+ private HostAndPortMapper hostAndPortMapper = null;
+
+ private Builder() {
+ }
+
+ public DefaultJedisClientConfig build() {
+ return new DefaultJedisClientConfig(connectionTimeout, soTimeout, infiniteSoTimeout,
+ user, password, databse, clientName,
+ ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMapper);
+ }
+
+ public Builder withConnectionTimeout(int connectionTimeout) {
+ this.connectionTimeout = connectionTimeout;
+ return this;
+ }
+
+ public Builder withSoTimeout(int soTimeout) {
+ this.soTimeout = soTimeout;
+ return this;
+ }
+
+ public Builder withInfiniteSoTimeout(int infiniteSoTimeout) {
+ this.infiniteSoTimeout = infiniteSoTimeout;
+ return this;
+ }
+
+ public Builder withUser(String user) {
+ this.user = user;
+ return this;
+ }
+
+ public Builder withPassword(String password) {
+ this.password = password;
+ return this;
+ }
+
+ public Builder withDatabse(int databse) {
+ this.databse = databse;
+ return this;
+ }
+
+ public Builder withClientName(String clientName) {
+ this.clientName = clientName;
+ return this;
+ }
+
+ public Builder withSsl(boolean ssl) {
+ this.ssl = ssl;
+ return this;
+ }
+
+ public Builder withSslSocketFactory(SSLSocketFactory sslSocketFactory) {
+ this.sslSocketFactory = sslSocketFactory;
+ return this;
+ }
+
+ public Builder withSslParameters(SSLParameters sslParameters) {
+ this.sslParameters = sslParameters;
+ return this;
+ }
+
+ public Builder withHostnameVerifier(HostnameVerifier hostnameVerifier) {
+ this.hostnameVerifier = hostnameVerifier;
+ return this;
+ }
+
+ public Builder withHostAndPortMapper(HostAndPortMapper hostAndPortMapper) {
+ this.hostAndPortMapper = hostAndPortMapper;
+ return this;
+ }
+ }
+
+ public static DefaultJedisClientConfig copyConfig(JedisClientConfig copy) {
+ return new DefaultJedisClientConfig(copy.getConnectionTimeout(), copy.getSoTimeout(),
+ copy.getInfiniteSoTimeout(), copy.getUser(), copy.getPassword(), copy.getDatabase(),
+ copy.getClientName(), copy.isSsl(), copy.getSslSocketFactory(), copy.getSslParameters(),
+ copy.getHostnameVerifier(), copy.getHostAndPortMapper());
+ }
+}
diff --git a/src/main/java/redis/clients/jedis/DefaultJedisSocketFactory.java b/src/main/java/redis/clients/jedis/DefaultJedisSocketFactory.java
index 1c914962a9..63200c2d9e 100644
--- a/src/main/java/redis/clients/jedis/DefaultJedisSocketFactory.java
+++ b/src/main/java/redis/clients/jedis/DefaultJedisSocketFactory.java
@@ -1,31 +1,41 @@
package redis.clients.jedis;
-import redis.clients.jedis.exceptions.JedisConnectionException;
-
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Socket;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.Socket;
+
+import redis.clients.jedis.exceptions.JedisConnectionException;
+import redis.clients.jedis.util.IOUtils;
public class DefaultJedisSocketFactory implements JedisSocketFactory {
- private String host;
- private int port;
- private int connectionTimeout;
- private int soTimeout;
- private boolean ssl;
- private SSLSocketFactory sslSocketFactory;
- private SSLParameters sslParameters;
- private HostnameVerifier hostnameVerifier;
+ protected static final HostAndPort DEFAULT_HOST_AND_PORT = new HostAndPort(Protocol.DEFAULT_HOST, Protocol.DEFAULT_PORT);
+
+ private HostAndPort hostAndPort = DEFAULT_HOST_AND_PORT;
+ private int connectionTimeout = Protocol.DEFAULT_TIMEOUT;
+ private int soTimeout = Protocol.DEFAULT_TIMEOUT;
+ private boolean ssl = false;
+ private SSLSocketFactory sslSocketFactory = null;
+ private SSLParameters sslParameters = null;
+ private HostnameVerifier hostnameVerifier = null;
+ private HostAndPortMapper hostAndPortMapper = null;
+
+ public DefaultJedisSocketFactory() {
+ }
+
+ public DefaultJedisSocketFactory(HostAndPort hostAndPort) {
+ this(hostAndPort, null);
+ }
+ @Deprecated
public DefaultJedisSocketFactory(String host, int port, int connectionTimeout, int soTimeout,
boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
HostnameVerifier hostnameVerifier) {
- this.host = host;
- this.port = port;
+ this.hostAndPort = new HostAndPort(host, port);
this.connectionTimeout = connectionTimeout;
this.soTimeout = soTimeout;
this.ssl = ssl;
@@ -34,77 +44,114 @@ public DefaultJedisSocketFactory(String host, int port, int connectionTimeout, i
this.hostnameVerifier = hostnameVerifier;
}
+ public DefaultJedisSocketFactory(HostAndPort hostAndPort, JedisClientConfig config) {
+ this.hostAndPort = hostAndPort;
+ if (config != null) {
+ this.connectionTimeout = config.getConnectionTimeout();
+ this.soTimeout = config.getSoTimeout();
+ this.ssl = config.isSsl();
+ this.sslSocketFactory = config.getSslSocketFactory();
+ this.sslParameters = config.getSslParameters();
+ this.hostnameVerifier = config.getHostnameVerifier();
+ this.hostAndPortMapper = config.getHostAndPortMapper();
+ }
+ }
+
@Override
- public Socket createSocket() throws IOException {
+ public Socket createSocket() throws JedisConnectionException {
Socket socket = null;
try {
socket = new Socket();
// ->@wjw_add
socket.setReuseAddress(true);
- socket.setKeepAlive(true); // Will monitor the TCP connection is
- // valid
- socket.setTcpNoDelay(true); // Socket buffer Whetherclosed, to
- // ensure timely delivery of data
- socket.setSoLinger(true, 0); // Control calls close () method,
- // the underlying socket is closed
- // immediately
+ socket.setKeepAlive(true); // Will monitor the TCP connection is valid
+ socket.setTcpNoDelay(true); // Socket buffer Whetherclosed, to ensure timely delivery of data
+ socket.setSoLinger(true, 0); // Control calls close () method, the underlying socket is closed immediately
// <-@wjw_add
- socket.connect(new InetSocketAddress(getHost(), getPort()), getConnectionTimeout());
+ HostAndPort hostAndPort = getSocketHostAndPort();
+ socket.connect(new InetSocketAddress(hostAndPort.getHost(), hostAndPort.getPort()), getConnectionTimeout());
socket.setSoTimeout(getSoTimeout());
if (ssl) {
+ SSLSocketFactory sslSocketFactory = getSslSocketFactory();
if (null == sslSocketFactory) {
sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
}
- socket = sslSocketFactory.createSocket(socket, getHost(), getPort(), true);
+ socket = sslSocketFactory.createSocket(socket, hostAndPort.getHost(), hostAndPort.getPort(), true);
+
+ SSLParameters sslParameters = getSslParameters();
if (null != sslParameters) {
((SSLSocket) socket).setSSLParameters(sslParameters);
}
- if ((null != hostnameVerifier)
- && (!hostnameVerifier.verify(getHost(), ((SSLSocket) socket).getSession()))) {
+
+ HostnameVerifier hostnameVerifier = getHostnameVerifier();
+ if (null != hostnameVerifier
+ && !hostnameVerifier.verify(hostAndPort.getHost(), ((SSLSocket) socket).getSession())) {
String message = String.format(
- "The connection to '%s' failed ssl/tls hostname verification.", getHost());
+ "The connection to '%s' failed ssl/tls hostname verification.", hostAndPort.getHost());
throw new JedisConnectionException(message);
}
}
+
return socket;
- } catch (Exception ex) {
- if (socket != null) {
- socket.close();
+
+ } catch (IOException ex) {
+
+ IOUtils.closeQuietly(socket);
+
+ throw new JedisConnectionException("Failed to create socket.", ex);
+ }
+ }
+
+ public HostAndPort getSocketHostAndPort() {
+ HostAndPortMapper mapper = getHostAndPortMapper();
+ HostAndPort hostAndPort = getHostAndPort();
+ if (mapper != null) {
+ HostAndPort mapped = mapper.getHostAndPort(hostAndPort);
+ if (mapped != null) {
+ return mapped;
}
- throw ex;
}
+ return hostAndPort;
+ }
+
+ public HostAndPort getHostAndPort() {
+ return this.hostAndPort;
+ }
+
+ public void setHostAndPort(HostAndPort hostAndPort) {
+ this.hostAndPort = hostAndPort;
}
@Override
public String getDescription() {
- return host + ":" + port;
+ return this.hostAndPort.toString();
}
@Override
public String getHost() {
- return host;
+ return this.hostAndPort.getHost();
}
@Override
public void setHost(String host) {
- this.host = host;
+ this.hostAndPort = new HostAndPort(host, this.hostAndPort.getPort());
}
@Override
public int getPort() {
- return port;
+ return this.hostAndPort.getPort();
}
@Override
public void setPort(int port) {
- this.port = port;
+ this.hostAndPort = new HostAndPort(this.hostAndPort.getHost(), port);
}
@Override
public int getConnectionTimeout() {
- return connectionTimeout;
+ return this.connectionTimeout;
}
@Override
@@ -114,11 +161,51 @@ public void setConnectionTimeout(int connectionTimeout) {
@Override
public int getSoTimeout() {
- return soTimeout;
+ return this.soTimeout;
}
@Override
public void setSoTimeout(int soTimeout) {
this.soTimeout = soTimeout;
}
+
+ public boolean isSsl() {
+ return ssl;
+ }
+
+ public void setSsl(boolean ssl) {
+ this.ssl = ssl;
+ }
+
+ public SSLSocketFactory getSslSocketFactory() {
+ return sslSocketFactory;
+ }
+
+ public void setSslSocketFactory(SSLSocketFactory sslSocketFactory) {
+ this.sslSocketFactory = sslSocketFactory;
+ }
+
+ public SSLParameters getSslParameters() {
+ return sslParameters;
+ }
+
+ public void setSslParameters(SSLParameters sslParameters) {
+ this.sslParameters = sslParameters;
+ }
+
+ public HostnameVerifier getHostnameVerifier() {
+ return hostnameVerifier;
+ }
+
+ public void setHostnameVerifier(HostnameVerifier hostnameVerifier) {
+ this.hostnameVerifier = hostnameVerifier;
+ }
+
+ public HostAndPortMapper getHostAndPortMapper() {
+ return hostAndPortMapper;
+ }
+
+ public void setHostAndPortMapper(HostAndPortMapper hostAndPortMapper) {
+ this.hostAndPortMapper = hostAndPortMapper;
+ }
}
diff --git a/src/main/java/redis/clients/jedis/HostAndPortMapper.java b/src/main/java/redis/clients/jedis/HostAndPortMapper.java
new file mode 100644
index 0000000000..68727d9ca6
--- /dev/null
+++ b/src/main/java/redis/clients/jedis/HostAndPortMapper.java
@@ -0,0 +1,6 @@
+package redis.clients.jedis;
+
+public interface HostAndPortMapper {
+
+ HostAndPort getHostAndPort(HostAndPort hap);
+}
diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java
index 31aee87fb8..f39893b2f4 100644
--- a/src/main/java/redis/clients/jedis/Jedis.java
+++ b/src/main/java/redis/clients/jedis/Jedis.java
@@ -45,14 +45,26 @@ public Jedis() {
super();
}
- public Jedis(final String host) {
- super(host);
+ /**
+ * @deprecated This constructor will not support a host string in future. It will accept only a
+ * uri string. {@link JedisURIHelper#isValid(java.net.URI)} can used before this. If this
+ * constructor was being used with a host, it can be replaced with
+ * {@link #Jedis(java.lang.String, int)} with the host and {@link Protocol#DEFAULT_PORT}.
+ * @param uri
+ */
+ @Deprecated
+ public Jedis(final String uri) {
+ super(uri);
}
public Jedis(final HostAndPort hp) {
super(hp);
}
+ public Jedis(final HostAndPort hp, final JedisClientConfig config) {
+ super(hp, config);
+ }
+
public Jedis(final String host, final int port) {
super(host, port);
}
@@ -147,6 +159,10 @@ public Jedis(final URI uri, final int connectionTimeout, final int soTimeout,
super(uri, connectionTimeout, soTimeout, infiniteSoTimeout, sslSocketFactory, sslParameters, hostnameVerifier);
}
+ public Jedis(final URI uri, JedisClientConfig config) {
+ super(uri, config);
+ }
+
public Jedis(final JedisSocketFactory jedisSocketFactory) {
super(jedisSocketFactory);
}
diff --git a/src/main/java/redis/clients/jedis/JedisClientConfig.java b/src/main/java/redis/clients/jedis/JedisClientConfig.java
new file mode 100644
index 0000000000..4add4808c1
--- /dev/null
+++ b/src/main/java/redis/clients/jedis/JedisClientConfig.java
@@ -0,0 +1,37 @@
+package redis.clients.jedis;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLParameters;
+import javax.net.ssl.SSLSocketFactory;
+
+public interface JedisClientConfig {
+
+ int getConnectionTimeout();
+
+ int getSoTimeout();
+
+ /**
+ * @return Socket timeout (in milliseconds) to use during blocking operation. Default is '0',
+ * which means to block forever.
+ */
+ int getInfiniteSoTimeout();
+
+ String getUser();
+
+ String getPassword();
+
+ int getDatabase();
+
+ String getClientName();
+
+ boolean isSsl();
+
+ SSLSocketFactory getSslSocketFactory();
+
+ SSLParameters getSslParameters();
+
+ HostnameVerifier getHostnameVerifier();
+
+ HostAndPortMapper getHostAndPortMapper();
+
+}
diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java
index 8409f02440..b1631dadf2 100644
--- a/src/main/java/redis/clients/jedis/JedisCluster.java
+++ b/src/main/java/redis/clients/jedis/JedisCluster.java
@@ -83,6 +83,10 @@ public JedisCluster(HostAndPort node, int connectionTimeout, int soTimeout, int
this(Collections.singleton(node), connectionTimeout, soTimeout, maxAttempts, user, password, clientName, poolConfig, ssl);
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public JedisCluster(HostAndPort node, int connectionTimeout, int soTimeout,
int maxAttempts, String password, String clientName, final GenericObjectPoolConfig poolConfig,
boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
@@ -91,6 +95,10 @@ public JedisCluster(HostAndPort node, int connectionTimeout, int soTimeout,
ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMap);
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public JedisCluster(HostAndPort node, int connectionTimeout, int soTimeout,
int maxAttempts, String user, String password, String clientName, final GenericObjectPoolConfig poolConfig,
boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
@@ -99,6 +107,10 @@ public JedisCluster(HostAndPort node, int connectionTimeout, int soTimeout,
ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMap);
}
+ public JedisCluster(HostAndPort node, final JedisClientConfig clientConfig, int maxAttempts, final GenericObjectPoolConfig poolConfig) {
+ this(Collections.singleton(node), clientConfig, maxAttempts, poolConfig);
+ }
+
public JedisCluster(Set nodes) {
this(nodes, DEFAULT_TIMEOUT);
}
@@ -161,6 +173,10 @@ public JedisCluster(Set jedisClusterNode, int connectionTimeout, in
super(jedisClusterNode, connectionTimeout, soTimeout, maxAttempts, user, password, clientName, poolConfig, ssl);
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public JedisCluster(Set jedisClusterNode, int connectionTimeout, int soTimeout,
int maxAttempts, String password, String clientName, final GenericObjectPoolConfig poolConfig,
boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
@@ -169,6 +185,10 @@ public JedisCluster(Set jedisClusterNode, int connectionTimeout, in
ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMap);
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public JedisCluster(Set jedisClusterNode, int connectionTimeout, int soTimeout, int infiniteSoTimeout,
int maxAttempts, String password, String clientName, final GenericObjectPoolConfig poolConfig,
boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
@@ -177,6 +197,10 @@ public JedisCluster(Set jedisClusterNode, int connectionTimeout, in
clientName, poolConfig, ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMap);
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public JedisCluster(Set jedisClusterNode, int connectionTimeout, int soTimeout,
int maxAttempts, String user, String password, String clientName, final GenericObjectPoolConfig poolConfig,
boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
@@ -185,6 +209,10 @@ public JedisCluster(Set jedisClusterNode, int connectionTimeout, in
ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMap);
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public JedisCluster(Set jedisClusterNode, int connectionTimeout, int soTimeout, int infiniteSoTimeout,
int maxAttempts, String user, String password, String clientName, final GenericObjectPoolConfig poolConfig,
boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
@@ -193,6 +221,11 @@ public JedisCluster(Set jedisClusterNode, int connectionTimeout, in
clientName, poolConfig, ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMap);
}
+ public JedisCluster(Set nodes, final JedisClientConfig clientConfig, int maxAttempts,
+ final GenericObjectPoolConfig poolConfig) {
+ super(nodes, clientConfig, maxAttempts, poolConfig);
+ }
+
@Override
public String set(final String key, final String value) {
return new JedisClusterCommand(connectionHandler, maxAttempts) {
diff --git a/src/main/java/redis/clients/jedis/JedisClusterConnectionHandler.java b/src/main/java/redis/clients/jedis/JedisClusterConnectionHandler.java
index 473a5cbb53..f6ac4d1fe9 100644
--- a/src/main/java/redis/clients/jedis/JedisClusterConnectionHandler.java
+++ b/src/main/java/redis/clients/jedis/JedisClusterConnectionHandler.java
@@ -34,6 +34,10 @@ public JedisClusterConnectionHandler(Set nodes, final GenericObject
this(nodes, poolConfig, connectionTimeout, soTimeout, infiniteSoTimeout, user, password, clientName, false, null, null, null, null);
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public JedisClusterConnectionHandler(Set nodes, GenericObjectPoolConfig poolConfig,
int connectionTimeout, int soTimeout, String password, String clientName,
boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
@@ -41,6 +45,10 @@ public JedisClusterConnectionHandler(Set nodes, GenericObjectPoolCo
this(nodes, poolConfig, connectionTimeout, soTimeout, null, password, clientName, ssl, sslSocketFactory, sslParameters, hostnameVerifier, portMap);
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public JedisClusterConnectionHandler(Set nodes, GenericObjectPoolConfig poolConfig,
int connectionTimeout, int soTimeout, String user, String password, String clientName,
boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
@@ -48,14 +56,42 @@ public JedisClusterConnectionHandler(Set nodes, GenericObjectPoolCo
this(nodes, poolConfig, connectionTimeout, soTimeout, 0, user, password, clientName, ssl, sslSocketFactory, sslParameters, hostnameVerifier, portMap);
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public JedisClusterConnectionHandler(Set nodes, final GenericObjectPoolConfig poolConfig,
int connectionTimeout, int soTimeout, int infiniteSoTimeout, String user, String password, String clientName,
boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
HostnameVerifier hostnameVerifier, JedisClusterHostAndPortMap portMap) {
- this.cache = new JedisClusterInfoCache(poolConfig, connectionTimeout, soTimeout, infiniteSoTimeout,
- user, password, clientName, ssl, sslSocketFactory, sslParameters, hostnameVerifier, portMap);
- initializeSlotsCache(nodes, connectionTimeout, soTimeout, infiniteSoTimeout,
- user, password, clientName, ssl, sslSocketFactory, sslParameters, hostnameVerifier);
+ this(nodes,
+ DefaultJedisClientConfig.builder().withConnectionTimeout(connectionTimeout)
+ .withSoTimeout(soTimeout).withInfiniteSoTimeout(infiniteSoTimeout)
+ .withUser(user).withPassword(password).withClientName(clientName)
+ .withSsl(ssl).withSslSocketFactory(sslSocketFactory).withSslParameters(sslParameters)
+ .withHostnameVerifier(hostnameVerifier).build(),
+ poolConfig,
+ DefaultJedisClientConfig.builder().withConnectionTimeout(connectionTimeout)
+ .withSoTimeout(soTimeout).withInfiniteSoTimeout(infiniteSoTimeout)
+ .withUser(user).withPassword(password).withClientName(clientName)
+ .withSsl(ssl).withSslSocketFactory(sslSocketFactory).withSslParameters(sslParameters)
+ .withHostnameVerifier(hostnameVerifier).withHostAndPortMapper(portMap).build());
+ }
+
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
+ public JedisClusterConnectionHandler(Set nodes, final JedisClientConfig seedNodesClientConfig,
+ final GenericObjectPoolConfig poolConfig, final JedisClientConfig clusterNodesClientConfig) {
+ this.cache = new JedisClusterInfoCache(poolConfig, clusterNodesClientConfig);
+ initializeSlotsCache(nodes, seedNodesClientConfig);
+ }
+
+ public JedisClusterConnectionHandler(Set nodes,
+ final GenericObjectPoolConfig poolConfig, final JedisClientConfig clientConfig) {
+ this.cache = new JedisClusterInfoCache(poolConfig, clientConfig);
+ initializeSlotsCache(nodes, clientConfig);
}
protected abstract Jedis getConnection();
@@ -70,22 +106,10 @@ public Map getNodes() {
return cache.getNodes();
}
- private void initializeSlotsCache(Set startNodes,
- int connectionTimeout, int soTimeout, int infiniteSoTimeout, String user, String password, String clientName,
- boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters, HostnameVerifier hostnameVerifier) {
- for (HostAndPort hostAndPort : startNodes) {
+ private void initializeSlotsCache(Set startNodes, JedisClientConfig clientConfig) {
- try (Jedis jedis = new Jedis(hostAndPort.getHost(), hostAndPort.getPort(), connectionTimeout,
- soTimeout, infiniteSoTimeout, ssl, sslSocketFactory, sslParameters, hostnameVerifier)) {
-
- if (user != null) {
- jedis.auth(user, password);
- } else if (password != null) {
- jedis.auth(password);
- }
- if (clientName != null) {
- jedis.clientSetname(clientName);
- }
+ for (HostAndPort hostAndPort : startNodes) {
+ try (Jedis jedis = new Jedis(hostAndPort, clientConfig)) {
cache.discoverClusterNodesAndSlots(jedis);
return;
} catch (JedisConnectionException e) {
diff --git a/src/main/java/redis/clients/jedis/JedisClusterHostAndPortMap.java b/src/main/java/redis/clients/jedis/JedisClusterHostAndPortMap.java
index 9a5a5029cb..f76b0f4d9a 100644
--- a/src/main/java/redis/clients/jedis/JedisClusterHostAndPortMap.java
+++ b/src/main/java/redis/clients/jedis/JedisClusterHostAndPortMap.java
@@ -1,5 +1,15 @@
package redis.clients.jedis;
-public interface JedisClusterHostAndPortMap {
+/**
+ * @deprecated This will be removed in future. Prefer to use {@link HostAndPortMapper} instead.
+ */
+@Deprecated
+public interface JedisClusterHostAndPortMap extends HostAndPortMapper {
+
HostAndPort getSSLHostAndPort(String host, int port);
+
+ @Override
+ default HostAndPort getHostAndPort(HostAndPort hap) {
+ return getSSLHostAndPort(hap.getHost(), hap.getPort());
+ }
}
diff --git a/src/main/java/redis/clients/jedis/JedisClusterInfoCache.java b/src/main/java/redis/clients/jedis/JedisClusterInfoCache.java
index b5242dd1e3..6d3ae52d1a 100644
--- a/src/main/java/redis/clients/jedis/JedisClusterInfoCache.java
+++ b/src/main/java/redis/clients/jedis/JedisClusterInfoCache.java
@@ -25,20 +25,9 @@ public class JedisClusterInfoCache {
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
private volatile boolean rediscovering;
- private final GenericObjectPoolConfig poolConfig;
-
- private int connectionTimeout;
- private int soTimeout;
- private int infiniteSoTimeout;
- private String user;
- private String password;
- private String clientName;
- private boolean ssl;
- private SSLSocketFactory sslSocketFactory;
- private SSLParameters sslParameters;
- private HostnameVerifier hostnameVerifier;
- private JedisClusterHostAndPortMap hostAndPortMap;
+ private final GenericObjectPoolConfig poolConfig;
+ private final JedisClientConfig clientConfig;
private static final int MASTER_NODE_INDEX = 2;
@@ -58,15 +47,19 @@ public JedisClusterInfoCache(final GenericObjectPoolConfig poolConfig, final int
public JedisClusterInfoCache(final GenericObjectPoolConfig poolConfig,
final int connectionTimeout, final int soTimeout, final String user, final String password, final String clientName) {
- this(poolConfig, connectionTimeout, soTimeout, user, password, clientName, false, null, null, null, null);
+ this(poolConfig, connectionTimeout, soTimeout, user, password, clientName, false, null, null, null, (HostAndPortMapper) null);
}
public JedisClusterInfoCache(final GenericObjectPoolConfig poolConfig,
final int connectionTimeout, final int soTimeout, final int infiniteSoTimeout,
final String user, final String password, final String clientName) {
- this(poolConfig, connectionTimeout, soTimeout, infiniteSoTimeout, user, password, clientName, false, null, null, null, null);
+ this(poolConfig, connectionTimeout, soTimeout, infiniteSoTimeout, user, password, clientName, false, null, null, null, (HostAndPortMapper) null);
}
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public JedisClusterInfoCache(final GenericObjectPoolConfig poolConfig, final int connectionTimeout,
final int soTimeout, final String password, final String clientName,
boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
@@ -74,6 +67,17 @@ public JedisClusterInfoCache(final GenericObjectPoolConfig poolConfig, final int
this(poolConfig, connectionTimeout, soTimeout, null, password, clientName, ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMap);
}
+ public JedisClusterInfoCache(final GenericObjectPoolConfig poolConfig, final int connectionTimeout,
+ final int soTimeout, final String password, final String clientName,
+ boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
+ HostnameVerifier hostnameVerifier, HostAndPortMapper hostAndPortMap) {
+ this(poolConfig, connectionTimeout, soTimeout, null, password, clientName, ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMap);
+ }
+
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public JedisClusterInfoCache(final GenericObjectPoolConfig poolConfig, final int connectionTimeout,
final int soTimeout, final String user, final String password, final String clientName,
boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
@@ -81,23 +85,44 @@ public JedisClusterInfoCache(final GenericObjectPoolConfig poolConfig, final int
this(poolConfig, connectionTimeout, soTimeout, 0, user, password, clientName, ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMap);
}
+ public JedisClusterInfoCache(final GenericObjectPoolConfig poolConfig, final int connectionTimeout,
+ final int soTimeout, final String user, final String password, final String clientName,
+ boolean ssl, SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
+ HostnameVerifier hostnameVerifier, HostAndPortMapper hostAndPortMap) {
+ this(poolConfig, connectionTimeout, soTimeout, 0, user, password, clientName, ssl, sslSocketFactory, sslParameters, hostnameVerifier, hostAndPortMap);
+ }
+
+ /**
+ * @deprecated This constructor will be removed in future.
+ */
+ @Deprecated
public JedisClusterInfoCache(final GenericObjectPoolConfig poolConfig,
final int connectionTimeout, final int soTimeout, final int infiniteSoTimeout,
final String user, final String password, final String clientName, boolean ssl,
SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
HostnameVerifier hostnameVerifier, JedisClusterHostAndPortMap hostAndPortMap) {
+ this(poolConfig, connectionTimeout, soTimeout, infiniteSoTimeout, user, password, clientName,
+ ssl, sslSocketFactory, sslParameters, hostnameVerifier, (HostAndPortMapper) hostAndPortMap);
+ }
+
+ public JedisClusterInfoCache(final GenericObjectPoolConfig poolConfig,
+ final int connectionTimeout, final int soTimeout, final int infiniteSoTimeout,
+ final String user, final String password, final String clientName, boolean ssl,
+ SSLSocketFactory sslSocketFactory, SSLParameters sslParameters,
+ HostnameVerifier hostnameVerifier, HostAndPortMapper hostAndPortMap) {
+ this(poolConfig,
+ DefaultJedisClientConfig.builder().withConnectionTimeout(connectionTimeout)
+ .withSoTimeout(soTimeout).withInfiniteSoTimeout(infiniteSoTimeout)
+ .withUser(user).withPassword(password).withClientName(clientName)
+ .withSsl(ssl).withSslSocketFactory(sslSocketFactory)
+ .withSslParameters(sslParameters) .withHostnameVerifier(hostnameVerifier)
+ .withHostAndPortMapper(hostAndPortMap).build()
+ );
+ }
+
+ public JedisClusterInfoCache(final GenericObjectPoolConfig poolConfig, final JedisClientConfig clientConfig) {
this.poolConfig = poolConfig;
- this.connectionTimeout = connectionTimeout;
- this.soTimeout = soTimeout;
- this.infiniteSoTimeout = infiniteSoTimeout;
- this.user = user;
- this.password = password;
- this.clientName = clientName;
- this.ssl = ssl;
- this.sslSocketFactory = sslSocketFactory;
- this.sslParameters = sslParameters;
- this.hostnameVerifier = hostnameVerifier;
- this.hostAndPortMap = hostAndPortMap;
+ this.clientConfig = clientConfig;
}
public void discoverClusterNodesAndSlots(Jedis jedis) {
@@ -206,25 +231,17 @@ private void discoverClusterSlots(Jedis jedis) {
private HostAndPort generateHostAndPort(List