diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/JedisSubscription.java b/src/main/java/org/springframework/data/redis/connection/jedis/JedisSubscription.java index 9f47da201..9a68b64f8 100644 --- a/src/main/java/org/springframework/data/redis/connection/jedis/JedisSubscription.java +++ b/src/main/java/org/springframework/data/redis/connection/jedis/JedisSubscription.java @@ -38,6 +38,7 @@ class JedisSubscription extends AbstractSubscription { @Override protected void doClose() { + if (!getChannels().isEmpty()) { jedisPubSub.unsubscribe(); } diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceSubscription.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceSubscription.java index 44225b206..6a88d8b57 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceSubscription.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceSubscription.java @@ -76,10 +76,6 @@ public class LettuceSubscription extends AbstractSubscription { @Override protected void doClose() { - if (!isAlive()) { - return; - } - List> futures = new ArrayList<>(); if (!getChannels().isEmpty()) { diff --git a/src/main/java/org/springframework/data/redis/connection/util/AbstractSubscription.java b/src/main/java/org/springframework/data/redis/connection/util/AbstractSubscription.java index 7dc482193..d650dc0f6 100644 --- a/src/main/java/org/springframework/data/redis/connection/util/AbstractSubscription.java +++ b/src/main/java/org/springframework/data/redis/connection/util/AbstractSubscription.java @@ -99,8 +99,19 @@ public abstract class AbstractSubscription implements Subscription { @Override public void close() { - doClose(); - alive.set(false); + + if (alive.compareAndSet(true, false)) { + + doClose(); + + synchronized (channels) { + channels.clear(); + } + + synchronized (patterns) { + patterns.clear(); + } + } } /** diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisSubscriptionUnitTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisSubscriptionUnitTests.java index bb8fd99c8..c6a5bf88c 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisSubscriptionUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisSubscriptionUnitTests.java @@ -35,6 +35,7 @@ import org.springframework.data.redis.connection.RedisInvalidSubscriptionExcepti * Unit test of {@link JedisSubscription} * * @author Jennifer Hickey + * @author Mark Paluch */ @ExtendWith(MockitoExtension.class) class JedisSubscriptionUnitTests { @@ -305,4 +306,15 @@ class JedisSubscriptionUnitTests { verify(jedisPubSub, times(1)).punsubscribe(); } + @Test // GH-2355 + void closeTwiceShouldUnsubscribeOnce() { + + subscription.subscribe(new byte[][] { "a".getBytes() }); + + subscription.close(); + subscription.close(); + + verify(jedisPubSub, times(1)).unsubscribe(); + } + }