diff --git a/src/main/java/redis/clients/jedis/Connection.java b/src/main/java/redis/clients/jedis/Connection.java index ebc6b0f..794c398 100644 --- a/src/main/java/redis/clients/jedis/Connection.java +++ b/src/main/java/redis/clients/jedis/Connection.java @@ -14,7 +14,6 @@ public class Connection { private String host; private int port = Protocol.DEFAULT_PORT; private Socket socket; - private boolean connected = false; private Protocol protocol = new Protocol(); private DataOutputStream outputStream; private DataInputStream inputStream; @@ -85,10 +84,9 @@ public class Connection { } public void connect() throws UnknownHostException, IOException { - if (!connected) { + if (!isConnected()) { socket = new Socket(host, port); socket.setSoTimeout(timeout); - connected = socket.isConnected(); outputStream = new DataOutputStream(socket.getOutputStream()); inputStream = new DataInputStream(new BufferedInputStream(socket .getInputStream())); @@ -96,7 +94,7 @@ public class Connection { } public void disconnect() { - if (connected) { + if (isConnected()) { try { inputStream.close(); outputStream.close(); @@ -106,12 +104,13 @@ public class Connection { } catch (IOException ex) { throw new JedisException(ex); } - connected = false; } } public boolean isConnected() { - return connected; + return socket != null && socket.isBound() && !socket.isClosed() + && socket.isConnected() && !socket.isInputShutdown() + && !socket.isOutputShutdown(); } protected String getStatusCodeReply() { diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 75d0d45..9a14037 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -787,4 +787,8 @@ public class Jedis { client.configSet(parameter, value); return client.getStatusCodeReply(); } + + public boolean isConnected() { + return client.isConnected(); + } } \ No newline at end of file diff --git a/src/main/java/redis/clients/jedis/JedisPool.java b/src/main/java/redis/clients/jedis/JedisPool.java index ca80203..53edbd0 100644 --- a/src/main/java/redis/clients/jedis/JedisPool.java +++ b/src/main/java/redis/clients/jedis/JedisPool.java @@ -41,16 +41,22 @@ public class JedisPool extends FixedResourcePool { @Override protected void destroyResource(Jedis jedis) { - jedis.quit(); - try { - jedis.disconnect(); - } catch (IOException e) { - throw new JedisException(e); + if (jedis.isConnected()) { + try { + jedis.quit(); + jedis.disconnect(); + } catch (Exception e) { + + } } } @Override protected boolean isResourceValid(Jedis jedis) { - return jedis.ping().equals("PONG"); + try { + return jedis.isConnected() && jedis.ping().equals("PONG"); + } catch (Exception ex) { + return false; + } } } \ No newline at end of file diff --git a/src/main/java/redis/clients/util/FixedResourcePool.java b/src/main/java/redis/clients/util/FixedResourcePool.java index 0f03dab..b4c785e 100644 --- a/src/main/java/redis/clients/util/FixedResourcePool.java +++ b/src/main/java/redis/clients/util/FixedResourcePool.java @@ -287,7 +287,7 @@ public abstract class FixedResourcePool { } catch (InterruptedException e1) { e1.printStackTrace(); } // If the wait gets interrupted, doesn't matter but print it (just - // in case). + // in case). } while (true); } diff --git a/src/test/java/redis/clients/jedis/tests/JedisPoolTest.java b/src/test/java/redis/clients/jedis/tests/JedisPoolTest.java index fb1a23a..1f5bd17 100644 --- a/src/test/java/redis/clients/jedis/tests/JedisPoolTest.java +++ b/src/test/java/redis/clients/jedis/tests/JedisPoolTest.java @@ -1,5 +1,6 @@ package redis.clients.jedis.tests; +import java.io.IOException; import java.util.concurrent.TimeoutException; import org.junit.Assert; @@ -36,4 +37,51 @@ public class JedisPoolTest extends Assert { pool.returnResource(jedis); } + @Test + public void checkJedisIsReusedWhenReturned() throws TimeoutException { + JedisPool pool = new JedisPool("localhost"); + pool.setResourcesNumber(1); + pool.init(); + + Jedis jedis = pool.getResource(200); + jedis.auth("foobared"); + jedis.set("foo", "0"); + pool.returnResource(jedis); + + jedis = pool.getResource(200); + jedis.auth("foobared"); + jedis.incr("foo"); + } + + @Test + public void checkPoolRepairedWhenJedisIsBroken() throws TimeoutException, + IOException { + JedisPool pool = new JedisPool("localhost"); + pool.setResourcesNumber(1); + pool.init(); + + Jedis jedis = pool.getResource(200); + jedis.auth("foobared"); + jedis.quit(); + pool.returnBrokenResource(jedis); + + jedis = pool.getResource(200); + jedis.auth("foobared"); + jedis.incr("foo"); + } + + @Test(expected = TimeoutException.class) + public void checkPoolOverflow() throws TimeoutException { + JedisPool pool = new JedisPool("localhost"); + pool.setResourcesNumber(1); + pool.init(); + + Jedis jedis = pool.getResource(200); + jedis.auth("foobared"); + jedis.set("foo", "0"); + + jedis = pool.getResource(200); + jedis.auth("foobared"); + jedis.incr("foo"); + } } \ No newline at end of file