diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnection.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnection.java index 811433aca..0f8e91f0c 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnection.java @@ -515,7 +515,7 @@ public class LettuceClusterConnection extends LettuceConnection implements Defau return result; } - /* + /* * (non-Javadoc) * @see org.springframework.data.redis.connection.lettuce.LettuceConnection#switchToPubSub() */ diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java index 8d7ce5f07..9f0800e21 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java @@ -798,6 +798,11 @@ public class LettuceConnection extends AbstractRedisConnection { } } + /** + * {@link #close()} the current connection and open a new pub/sub connection to the Redis server. + * + * @return never {@literal null}. + */ protected StatefulRedisPubSubConnection switchToPubSub() { close(); 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 c1820cd07..b52f2cd22 100644 --- a/src/test/java/org/springframework/data/redis/listener/PubSubResubscribeTests.java +++ b/src/test/java/org/springframework/data/redis/listener/PubSubResubscribeTests.java @@ -29,6 +29,7 @@ import java.util.Set; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import org.junit.After; import org.junit.AfterClass; @@ -38,6 +39,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; +import org.junit.runners.model.Statement; import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.springframework.core.task.SyncTaskExecutor; import org.springframework.data.redis.ConnectionFactoryTracker; @@ -53,6 +55,7 @@ import org.springframework.data.redis.connection.lettuce.LettuceTestClientResour import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; +import org.springframework.data.redis.test.util.RedisClusterRule; /** * @author Costin Leau @@ -97,6 +100,8 @@ public class PubSubResubscribeTests { int port = SettingsUtils.getPort(); String host = SettingsUtils.getHost(); + List factories = new ArrayList<>(3); + // Jedis JedisConnectionFactory jedisConnFactory = new JedisConnectionFactory(); jedisConnFactory.setUsePool(false); @@ -105,6 +110,8 @@ public class PubSubResubscribeTests { jedisConnFactory.setDatabase(2); jedisConnFactory.afterPropertiesSet(); + factories.add(jedisConnFactory); + // Lettuce LettuceConnectionFactory lettuceConnFactory = new LettuceConnectionFactory(); lettuceConnFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); @@ -114,16 +121,22 @@ public class PubSubResubscribeTests { lettuceConnFactory.setValidateConnection(true); lettuceConnFactory.afterPropertiesSet(); - LettuceConnectionFactory lettuceClusterConnFactory = new LettuceConnectionFactory( - new RedisClusterConfiguration().clusterNode(ClusterTestVariables.CLUSTER_NODE_1)); - lettuceClusterConnFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - lettuceClusterConnFactory.setPort(port); - lettuceClusterConnFactory.setHostName(host); - lettuceClusterConnFactory.setValidateConnection(true); - lettuceClusterConnFactory.afterPropertiesSet(); + factories.add(lettuceConnFactory); - return Arrays - .asList(new Object[][] { { jedisConnFactory }, { lettuceConnFactory }, { lettuceClusterConnFactory } }); + if (clusterAvailable()) { + + LettuceConnectionFactory lettuceClusterConnFactory = new LettuceConnectionFactory( + new RedisClusterConfiguration().clusterNode(ClusterTestVariables.CLUSTER_NODE_1)); + lettuceClusterConnFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); + lettuceClusterConnFactory.setPort(port); + lettuceClusterConnFactory.setHostName(host); + lettuceClusterConnFactory.setValidateConnection(true); + lettuceClusterConnFactory.afterPropertiesSet(); + + factories.add(lettuceClusterConnFactory); + } + + return factories.stream().map(factory -> new Object[] { factory }).collect(Collectors.toList()); } @Before @@ -303,4 +316,19 @@ public class PubSubResubscribeTests { bag.add(message); } } + + private static boolean clusterAvailable() { + + try { + new RedisClusterRule().apply(new Statement() { + @Override + public void evaluate() throws Throwable { + + } + }, null).evaluate(); + } catch (Throwable throwable) { + return false; + } + return true; + } }