From 0a094ff0b4327f2fdffdc5fe051d7903ac084a92 Mon Sep 17 00:00:00 2001 From: Jungtaek Lim Date: Thu, 28 Aug 2014 23:49:52 +0900 Subject: [PATCH] Implements #701, add close() to JedisCluster --- .../redis/clients/jedis/JedisCluster.java | 18 ++++++++++- .../clients/jedis/tests/JedisClusterTest.java | 30 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java index 8e1202b..d5ffd0b 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -2,12 +2,13 @@ package redis.clients.jedis; import redis.clients.jedis.BinaryClient.LIST_POSITION; +import java.io.Closeable; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -public class JedisCluster implements JedisCommands, BasicCommands { +public class JedisCluster implements JedisCommands, BasicCommands, Closeable { public static final short HASHSLOTS = 16384; private static final int DEFAULT_TIMEOUT = 1; private static final int DEFAULT_MAX_REDIRECTIONS = 5; @@ -32,6 +33,21 @@ public class JedisCluster implements JedisCommands, BasicCommands { this.timeout = timeout; this.maxRedirections = maxRedirections; } + + @Override + public void close() { + if (connectionHandler != null) { + for (JedisPool pool : connectionHandler.getNodes().values()) { + try { + if (pool != null) { + pool.destroy(); + } + } catch (Exception e) { + // pass + } + } + } + } @Override public String set(final String key, final String value) { diff --git a/src/test/java/redis/clients/jedis/tests/JedisClusterTest.java b/src/test/java/redis/clients/jedis/tests/JedisClusterTest.java index 28af2a4..6dfac6d 100644 --- a/src/test/java/redis/clients/jedis/tests/JedisClusterTest.java +++ b/src/test/java/redis/clients/jedis/tests/JedisClusterTest.java @@ -2,6 +2,7 @@ package redis.clients.jedis.tests; import java.util.ArrayList; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Set; @@ -14,9 +15,11 @@ import org.junit.Test; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; +import redis.clients.jedis.JedisPool; import redis.clients.jedis.exceptions.JedisAskDataException; import redis.clients.jedis.exceptions.JedisClusterException; import redis.clients.jedis.exceptions.JedisClusterMaxRedirectionsException; +import redis.clients.jedis.exceptions.JedisConnectionException; import redis.clients.jedis.exceptions.JedisException; import redis.clients.jedis.exceptions.JedisMovedDataException; import redis.clients.jedis.tests.utils.JedisClusterTestUtil; @@ -321,6 +324,33 @@ public class JedisClusterTest extends Assert { assertEquals("foo", jc.get("51")); } + @Test + public void testCloseable() { + Set jedisClusterNode = new HashSet(); + jedisClusterNode.add(new HostAndPort(nodeInfo1.getHost(), nodeInfo1.getPort())); + + JedisCluster jc = null; + try { + jc = new JedisCluster(jedisClusterNode); + jc.set("51", "foo"); + } finally { + if (jc != null) { + jc.close(); + } + } + + Iterator poolIterator = jc.getClusterNodes().values().iterator(); + while (poolIterator.hasNext()) { + JedisPool pool = poolIterator.next(); + try { + pool.getResource(); + fail("JedisCluster's internal pools should be already destroyed"); + } catch (JedisConnectionException e) { + // ok to go... + } + } + } + private static String getNodeServingSlotRange(String infoOutput) { // f4f3dc4befda352a4e0beccf29f5e8828438705d 127.0.0.1:7380 master - 0 1394372400827 0 connected 5461-10922 for (String infoLine : infoOutput.split("\n")) {