diff --git a/pom.xml b/pom.xml index b550c90..5285b74 100644 --- a/pom.xml +++ b/pom.xml @@ -56,6 +56,13 @@ jar compile + + commons-pool + commons-pool + 1.5.5 + jar + compile + diff --git a/src/main/java/redis/clients/jedis/Connection.java b/src/main/java/redis/clients/jedis/Connection.java index 96bf728..d09d0cc 100644 --- a/src/main/java/redis/clients/jedis/Connection.java +++ b/src/main/java/redis/clients/jedis/Connection.java @@ -18,7 +18,7 @@ public class Connection { private RedisOutputStream outputStream; private RedisInputStream inputStream; private int pipelinedCommands = 0; - private int timeout = 2000; + private int timeout = Protocol.DEFAULT_TIMEOUT; public int getTimeout() { return timeout; diff --git a/src/main/java/redis/clients/jedis/JedisPool.java b/src/main/java/redis/clients/jedis/JedisPool.java index 052410d..d0d4c20 100644 --- a/src/main/java/redis/clients/jedis/JedisPool.java +++ b/src/main/java/redis/clients/jedis/JedisPool.java @@ -1,82 +1,111 @@ package redis.clients.jedis; -import redis.clients.util.FixedResourcePool; +import org.apache.commons.pool.BasePoolableObjectFactory; +import org.apache.commons.pool.impl.GenericObjectPool; -public class JedisPool extends FixedResourcePool { - private String host; - private int port; - private int timeout; - private String password; +public class JedisPool { + private final GenericObjectPool internalPool; - public JedisPool(String host) { - this.host = host; - this.port = Protocol.DEFAULT_PORT; - } + public JedisPool(final GenericObjectPool.Config poolConfig, final String host) { + this(poolConfig, host, Protocol.DEFAULT_PORT, Protocol.DEFAULT_TIMEOUT, null); + } - public JedisPool(String host, int port) { - this.host = host; - this.port = port; - } + public JedisPool(final GenericObjectPool.Config poolConfig,final String host, final int port) { + this(poolConfig, host, port, Protocol.DEFAULT_TIMEOUT, null); + } - public JedisPool(String host, int port, int timeout) { - this.host = host; - this.port = port; - this.timeout = timeout; - } + public JedisPool(final GenericObjectPool.Config poolConfig,final String host, final int port, final int timeout) { + this(poolConfig, host, port, timeout, null); + } - public JedisPool(String host, int port, int timeout, String password) { - this.host = host; - this.port = port; - this.timeout = timeout; - this.password = password; - } + public JedisPool(final GenericObjectPool.Config poolConfig,final String host, final int port, final int timeout, final String password) { + final String lhost; + final int lport; + final int ltimeout; + final String lpassword; + lhost = host; + lport = port; + ltimeout = (timeout > 0) ? timeout : Protocol.DEFAULT_TIMEOUT; + lpassword = password; + + final JedisFactory factory = new JedisFactory(lhost, lport, ltimeout, lpassword); + this.internalPool = new GenericObjectPool(factory, poolConfig); + } - public JedisPool(JedisShardInfo shardInfo) { - this.host = shardInfo.getHost(); - this.port = shardInfo.getPort(); - this.timeout = shardInfo.getTimeout(); - this.password = shardInfo.getPassword(); - } + public JedisPool(final GenericObjectPool.Config poolConfig, final JedisShardInfo shardInfo) { + this(poolConfig, shardInfo.getHost(), shardInfo.getPort(), shardInfo.getTimeout(), shardInfo.getPassword()); + } + + public Jedis getResource() throws Exception { + return (Jedis) internalPool.borrowObject(); + } + + public void returnResource(final Jedis jedis) throws Exception { + internalPool.returnObject(jedis); + } - @Override - protected Jedis createResource() { - Jedis jedis = new Jedis(this.host, this.port, this.timeout); - boolean done = false; - while (!done) { - try { - jedis.connect(); - if (password != null) { - jedis.auth(password); + /** + * PoolableObjectFactory custom impl. + */ + private static class JedisFactory extends BasePoolableObjectFactory { + private final String host; + private final int port; + private final int timeout; + private final String password; + + public JedisFactory(final String host, final int port, final int timeout, final String password) { + super(); + this.host = host; + this.port = port; + this.timeout = (timeout > 0) ? timeout : -1; + this.password = password; } - done = true; - } catch (Exception e) { - try { - Thread.sleep(100); - } catch (InterruptedException e1) { + + @Override + public Object makeObject() throws Exception { + final Jedis jedis; + if (timeout > 0) { + jedis = new Jedis(this.host, this.port, this.timeout); + } else { + jedis = new Jedis(this.host, this.port); + } + + jedis.connect(); + if (null != this.password) { + jedis.auth(this.password); + } + return jedis; } - } - } - return jedis; - } - @Override - protected void destroyResource(Jedis jedis) { - if (jedis != null && jedis.isConnected()) { - try { - jedis.quit(); - jedis.disconnect(); - } catch (Exception e) { + @Override + public void destroyObject(final Object obj) throws Exception { + if(obj instanceof Jedis) { + final Jedis jedis = (Jedis) obj; + if (jedis.isConnected()) { + try { + jedis.quit(); + jedis.disconnect(); + } catch (Exception e) { + + } + } + } + } - } - } - } + @Override + public boolean validateObject(final Object obj) { + if(obj instanceof Jedis) { + final Jedis jedis = (Jedis) obj; + try { + return jedis.isConnected() && jedis.ping().equals("PONG"); + } catch (final Exception e) { + return false; + } + } else { + return false; + } + } - @Override - protected boolean isResourceValid(Jedis jedis) { - try { - return jedis.isConnected() && jedis.ping().equals("PONG"); - } catch (Exception ex) { - return false; + } - } } diff --git a/src/main/java/redis/clients/jedis/Protocol.java b/src/main/java/redis/clients/jedis/Protocol.java index e9e6211..8f66efb 100644 --- a/src/main/java/redis/clients/jedis/Protocol.java +++ b/src/main/java/redis/clients/jedis/Protocol.java @@ -12,6 +12,7 @@ import static redis.clients.util.RedisOutputStream.CHARSET; public final class Protocol { public static final int DEFAULT_PORT = 6379; + public static final int DEFAULT_TIMEOUT = 2000; public static final byte DOLLAR_BYTE = '$'; public static final byte ASTERISK_BYTE = '*';