diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java index 3187f0370..a24e1cc8e 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java @@ -72,6 +72,7 @@ public class JedisConnection implements RedisConnection { private volatile JedisSubscription subscription; private volatile Pipeline pipeline; + private final int dbIndex; /** * Constructs a new JedisConnection instance. @@ -79,7 +80,7 @@ public class JedisConnection implements RedisConnection { * @param jedis Jedis entity */ public JedisConnection(Jedis jedis) { - this(jedis, null); + this(jedis, null, 0); } /** @@ -89,13 +90,20 @@ public class JedisConnection implements RedisConnection { * @param jedis * @param pool can be null, if no pool is used */ - public JedisConnection(Jedis jedis, Pool pool) { + public JedisConnection(Jedis jedis, Pool pool, int dbIndex) { this.jedis = jedis; // extract underlying connection for batch operations client = (Client) ReflectionUtils.getField(CLIENT_FIELD, jedis); transaction = new Transaction(client); this.pool = pool; + + this.dbIndex = dbIndex; + + // select the db + if (dbIndex > 0) { + select(dbIndex); + } } protected DataAccessException convertJedisAccessException(Exception ex) { diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnectionFactory.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnectionFactory.java index 20cdfba51..c5e01ab7a 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnectionFactory.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnectionFactory.java @@ -24,6 +24,7 @@ import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.data.keyvalue.redis.connection.RedisConnection; import org.springframework.data.keyvalue.redis.connection.RedisConnectionFactory; +import org.springframework.util.Assert; import org.springframework.util.StringUtils; import redis.clients.jedis.Jedis; @@ -51,6 +52,8 @@ public class JedisConnectionFactory implements InitializingBean, DisposableBean, private JedisPool pool = null; private JedisPoolConfig poolConfig = new JedisPoolConfig(); + private int dbIndex = 0; + /** * Constructs a new JedisConnectionFactory instance * with default settings (default connection pooling, no shard information). @@ -99,6 +102,18 @@ public class JedisConnectionFactory implements InitializingBean, DisposableBean, } } + /** + * Post process a newly retrieved connection. Useful for decorating or executing + * initialization commands on a new connection. + * This implementation simply returns the connection. + * + * @param connection + * @return processed connection + */ + protected JedisConnection postProcessConnection(JedisConnection connection) { + return connection; + } + public void afterPropertiesSet() { if (shardInfo == null) { shardInfo = new JedisShardInfo(hostName, port); @@ -113,8 +128,8 @@ public class JedisConnectionFactory implements InitializingBean, DisposableBean, } if (usePool) { - pool = new JedisPool(poolConfig, shardInfo.getHost(), shardInfo.getPort(), - shardInfo.getTimeout(), shardInfo.getPassword()); + pool = new JedisPool(poolConfig, shardInfo.getHost(), shardInfo.getPort(), shardInfo.getTimeout(), + shardInfo.getPassword()); } } @@ -131,7 +146,8 @@ public class JedisConnectionFactory implements InitializingBean, DisposableBean, public JedisConnection getConnection() { Jedis jedis = fetchJedisConnector(); - return (usePool ? new JedisConnection(jedis, pool) : new JedisConnection(jedis)); + return postProcessConnection((usePool ? new JedisConnection(jedis, pool, dbIndex) : new JedisConnection(jedis, + null, dbIndex))); } @Override @@ -263,4 +279,15 @@ public class JedisConnectionFactory implements InitializingBean, DisposableBean, public void setPoolConfig(JedisPoolConfig poolConfig) { this.poolConfig = poolConfig; } + + /** + * Sets the index of the database used by this connection factory. + * Can be between 0 (default) and 15. + * + * @param index database index + */ + public void setDatabase(int index) { + Assert.isTrue(index >= 0 && index < 16, "invalid DB index (needs to be between 0 and 15)"); + this.dbIndex = index; + } } \ No newline at end of file diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jredis/JredisConnectionFactory.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jredis/JredisConnectionFactory.java index 832ca8f87..b833e78da 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jredis/JredisConnectionFactory.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jredis/JredisConnectionFactory.java @@ -45,6 +45,7 @@ public class JredisConnectionFactory implements InitializingBean, DisposableBean private int timeout; private boolean usePool = true; + private int dbIndex = DEFAULT_REDIS_DB; private JRedisService pool = null; // taken from JRedis code @@ -75,7 +76,7 @@ public class JredisConnectionFactory implements InitializingBean, DisposableBean public void afterPropertiesSet() { if (connectionSpec == null) { Assert.hasText(hostName); - connectionSpec = DefaultConnectionSpec.newSpec(hostName, port, DEFAULT_REDIS_DB, DEFAULT_REDIS_PASSWORD); + connectionSpec = DefaultConnectionSpec.newSpec(hostName, port, dbIndex, DEFAULT_REDIS_PASSWORD); connectionSpec.setConnectionFlag(Connection.Flag.RELIABLE, false); if (StringUtils.hasLength(password)) { @@ -105,10 +106,22 @@ public class JredisConnectionFactory implements InitializingBean, DisposableBean @Override public RedisConnection getConnection() { - return new JredisConnection((usePool ? pool : new JRedisClient(connectionSpec))); + return postProcessConnection(new JredisConnection((usePool ? pool : new JRedisClient(connectionSpec)))); } + /** + * Post process a newly retrieved connection. Useful for decorating or executing + * initialization commands on a new connection. + * This implementation simply returns the connection. + * + * @param connection + * @return processed connection + */ + protected RedisConnection postProcessConnection(JredisConnection connection) { + return connection; + } + @Override public DataAccessException translateExceptionIfPossible(RuntimeException ex) { if (ex instanceof ClientRuntimeException) { @@ -210,4 +223,15 @@ public class JredisConnectionFactory implements InitializingBean, DisposableBean this.poolSize = poolSize; usePool = true; } + + /** + * Sets the index of the database used by this connection factory. + * Can be between 0 (default) and 15. + * + * @param index database index + */ + public void setDatabase(int index) { + Assert.isTrue(index >= 0 && index < 16, "invalid DB index (needs to be between 0 and 15)"); + this.dbIndex = index; + } } \ No newline at end of file diff --git a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/listener/PubSubTestParams.java b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/listener/PubSubTestParams.java index ee7dd80bb..78dd27889 100644 --- a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/listener/PubSubTestParams.java +++ b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/listener/PubSubTestParams.java @@ -38,9 +38,10 @@ public class PubSubTestParams { ObjectFactory personFactory = new PersonObjectFactory(); JedisConnectionFactory jedisConnFactory = new JedisConnectionFactory(); - jedisConnFactory.setUsePool(false); + jedisConnFactory.setUsePool(true); jedisConnFactory.setPort(SettingsUtils.getPort()); jedisConnFactory.setHostName(SettingsUtils.getHost()); + jedisConnFactory.setDatabase(2); jedisConnFactory.afterPropertiesSet(); diff --git a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/listener/PubSubTests.java b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/listener/PubSubTests.java index daad32b5d..3f9f5a59d 100644 --- a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/listener/PubSubTests.java +++ b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/listener/PubSubTests.java @@ -57,7 +57,6 @@ public class PubSubTests { private final Object handler = new Object() { void handleMessage(String message) { - System.out.println("Received message " + message); bag.add(message); } };