diff --git a/src/main/java/redis/clients/jedis/JedisFactory.java b/src/main/java/redis/clients/jedis/JedisFactory.java index 3597d69..c04b43d 100644 --- a/src/main/java/redis/clients/jedis/JedisFactory.java +++ b/src/main/java/redis/clients/jedis/JedisFactory.java @@ -1,5 +1,7 @@ package redis.clients.jedis; +import java.util.concurrent.atomic.AtomicReference; + import org.apache.commons.pool2.PooledObject; import org.apache.commons.pool2.PooledObjectFactory; import org.apache.commons.pool2.impl.DefaultPooledObject; @@ -8,8 +10,7 @@ import org.apache.commons.pool2.impl.DefaultPooledObject; * PoolableObjectFactory custom impl. */ class JedisFactory implements PooledObjectFactory { - private final String host; - private final int port; + private final AtomicReference hostAndPort = new AtomicReference(); private final int timeout; private final String password; private final int database; @@ -23,14 +24,17 @@ class JedisFactory implements PooledObjectFactory { public JedisFactory(final String host, final int port, final int timeout, final String password, final int database, final String clientName) { super(); - this.host = host; - this.port = port; + this.hostAndPort.set(new HostAndPort(host, port)); this.timeout = timeout; this.password = password; this.database = database; this.clientName = clientName; } + public void setHostAndPort(final HostAndPort hostAndPort) { + this.hostAndPort.set(hostAndPort); + } + @Override public void activateObject(PooledObject pooledJedis) throws Exception { @@ -60,7 +64,8 @@ class JedisFactory implements PooledObjectFactory { @Override public PooledObject makeObject() throws Exception { - final Jedis jedis = new Jedis(this.host, this.port, this.timeout); + final HostAndPort hostAndPort = this.hostAndPort.get(); + final Jedis jedis = new Jedis(hostAndPort.getHost(), hostAndPort.getPort(), this.timeout); jedis.connect(); if (null != this.password) { @@ -86,7 +91,13 @@ class JedisFactory implements PooledObjectFactory { public boolean validateObject(PooledObject pooledJedis) { final BinaryJedis jedis = pooledJedis.getObject(); try { - return jedis.isConnected() && jedis.ping().equals("PONG"); + HostAndPort hostAndPort = this.hostAndPort.get(); + + String connectionHost = jedis.getClient().getHost(); + int connectionPort = jedis.getClient().getPort(); + + return hostAndPort.getHost().equals(connectionHost) && hostAndPort.getPort() == connectionPort && + jedis.isConnected() && jedis.ping().equals("PONG"); } catch (final Exception e) { return false; } diff --git a/src/main/java/redis/clients/jedis/JedisSentinelPool.java b/src/main/java/redis/clients/jedis/JedisSentinelPool.java index 0ff0dff..2e076b1 100644 --- a/src/main/java/redis/clients/jedis/JedisSentinelPool.java +++ b/src/main/java/redis/clients/jedis/JedisSentinelPool.java @@ -74,6 +74,7 @@ public class JedisSentinelPool extends Pool { initPool(master); } + private volatile JedisFactory factory; private volatile HostAndPort currentHostMaster; public void destroy() { @@ -91,10 +92,15 @@ public class JedisSentinelPool extends Pool { private void initPool(HostAndPort master) { if (!master.equals(currentHostMaster)) { currentHostMaster = master; + if (factory == null) { + factory = new JedisFactory(master.getHost(), master.getPort(), + timeout, password, database); + initPool(poolConfig, factory); + } else { + factory.setHostAndPort(currentHostMaster); + } + log.info("Created JedisPool to master at " + master); - initPool(poolConfig, - new JedisFactory(master.getHost(), master.getPort(), - timeout, password, database)); } }