diff --git a/src/main/java/org/springframework/data/redis/listener/RedisMessageListenerContainer.java b/src/main/java/org/springframework/data/redis/listener/RedisMessageListenerContainer.java index 1771ee577..b8b4f42bf 100644 --- a/src/main/java/org/springframework/data/redis/listener/RedisMessageListenerContainer.java +++ b/src/main/java/org/springframework/data/redis/listener/RedisMessageListenerContainer.java @@ -662,7 +662,7 @@ public class RedisMessageListenerContainer implements InitializingBean, Disposab // wait for subscription to be initialized boolean done = false; // wait 3 rounds for subscription to be initialized - for (int i = 0; i < ROUNDS || done; i++) { + for (int i = 0; i < ROUNDS && !done; i++) { if (connection != null) { synchronized (localMonitor) { if (connection != null && connection.isSubscribed()) { diff --git a/src/test/java/org/springframework/data/redis/listener/PubSubResubscribeTests.java b/src/test/java/org/springframework/data/redis/listener/PubSubResubscribeTests.java index ddbd4ae25..e97ee8cb6 100644 --- a/src/test/java/org/springframework/data/redis/listener/PubSubResubscribeTests.java +++ b/src/test/java/org/springframework/data/redis/listener/PubSubResubscribeTests.java @@ -22,6 +22,8 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -54,6 +56,8 @@ public class PubSubResubscribeTests { protected RedisMessageListenerContainer container; protected RedisConnectionFactory factory; + + @SuppressWarnings("rawtypes") protected RedisTemplate template; private final BlockingDeque bag = new LinkedBlockingDeque(99); @@ -191,6 +195,28 @@ public class PubSubResubscribeTests { assertTrue(set.contains(anotherPayload2)); } + /** + * Validates the behavior of {@link RedisMessageListenerContainer} when it needs to spin up + * a thread executing its PatternSubscriptionTask + * @throws Exception + */ + @Test + public void testInitializeContainerWithMultipleTopicsIncludingPattern() throws Exception { + container.removeMessageListener(adapter); + container.stop(); + container.addMessageListener(adapter, + Arrays.asList(new Topic[] { new ChannelTopic(CHANNEL), new PatternTopic("s*") })); + container.start(); + template.convertAndSend("somechannel", "HELLO"); + template.convertAndSend(CHANNEL, "WORLD"); + + Set set = new LinkedHashSet(); + set.add(bag.poll(1, TimeUnit.SECONDS)); + set.add(bag.poll(1, TimeUnit.SECONDS)); + + assertEquals(new HashSet(Arrays.asList(new String[] { "HELLO", "WORLD" })), set); + } + private class MessageHandler { private final BlockingDeque bag; private final String name; @@ -199,6 +225,8 @@ public class PubSubResubscribeTests { this.bag = bag; this.name = name; } + + @SuppressWarnings("unused") public void handleMessage(String message) { System.out.println(name + ": " + message); bag.add(message);