From 79e9ad310ec9eda357a00a922ee6af552c800848 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 11 Nov 2020 10:25:08 +0100 Subject: [PATCH] DATAREDIS-1248 - Use fresh JedisConnectionFactory in PubSubTests. We make sure to use a dedicated JedisConnectionFactory for Pub/Sub tests as connections can easily break in previous tests which causes connection synchronization issues in the connection itself and in consequence, tests fail with an unrelated cause. --- .../JedisConnectionFactoryExtension.java | 42 ++++++++++++++++--- .../data/redis/listener/PubSubTestParams.java | 4 +- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/extension/JedisConnectionFactoryExtension.java b/src/test/java/org/springframework/data/redis/connection/jedis/extension/JedisConnectionFactoryExtension.java index 4d193b19a..29b7b5a79 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/extension/JedisConnectionFactoryExtension.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/extension/JedisConnectionFactoryExtension.java @@ -19,6 +19,7 @@ import java.io.Closeable; import java.lang.annotation.Annotation; import java.util.HashMap; import java.util.Map; +import java.util.function.Supplier; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.ParameterContext; @@ -57,7 +58,7 @@ public class JedisConnectionFactoryExtension implements ParameterResolver { private static final JedisClientConfiguration CLIENT_CONFIGURATION = JedisClientConfiguration.builder() .clientName("jedis-client").usePooling().build(); - private static final Lazy STANDALONE = Lazy.of(() -> { + private static final NewableLazy STANDALONE = NewableLazy.of(() -> { ManagedJedisConnectionFactory factory = new ManagedJedisConnectionFactory(SettingsUtils.standaloneConfiguration(), CLIENT_CONFIGURATION); @@ -68,7 +69,7 @@ public class JedisConnectionFactoryExtension implements ParameterResolver { return factory; }); - private static final Lazy SENTINEL = Lazy.of(() -> { + private static final NewableLazy SENTINEL = NewableLazy.of(() -> { ManagedJedisConnectionFactory factory = new ManagedJedisConnectionFactory(SettingsUtils.sentinelConfiguration(), CLIENT_CONFIGURATION); @@ -79,7 +80,7 @@ public class JedisConnectionFactoryExtension implements ParameterResolver { return factory; }); - private static final Lazy CLUSTER = Lazy.of(() -> { + private static final NewableLazy CLUSTER = NewableLazy.of(() -> { ManagedJedisConnectionFactory factory = new ManagedJedisConnectionFactory(SettingsUtils.clusterConfiguration(), CLIENT_CONFIGURATION); @@ -90,7 +91,7 @@ public class JedisConnectionFactoryExtension implements ParameterResolver { return factory; }); - private static final Map, Lazy> factories; + private static final Map, NewableLazy> factories; static { @@ -101,8 +102,8 @@ public class JedisConnectionFactoryExtension implements ParameterResolver { } /** - * Obtain a {@link JedisConnectionFactory} described by {@code qualifier}. Instances are managed by this extension and - * will be shut down on JVM shutdown. + * Obtain a cached {@link JedisConnectionFactory} described by {@code qualifier}. Instances are managed by this + * extension and will be shut down on JVM shutdown. * * @param qualifier an be any of {@link RedisStanalone}, {@link RedisSentinel}, {@link RedisCluster}. * @return the managed {@link JedisConnectionFactory}. @@ -111,6 +112,17 @@ public class JedisConnectionFactoryExtension implements ParameterResolver { return factories.get(qualifier).get(); } + /** + * Obtain a new {@link JedisConnectionFactory} described by {@code qualifier}. Instances are managed by this extension + * and will be shut down on JVM shutdown. + * + * @param qualifier an be any of {@link RedisStanalone}, {@link RedisSentinel}, {@link RedisCluster}. + * @return the managed {@link JedisConnectionFactory}. + */ + public static JedisConnectionFactory getNewConnectionFactory(Class qualifier) { + return factories.get(qualifier).getNew(); + } + @Override public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { @@ -141,6 +153,24 @@ public class JedisConnectionFactoryExtension implements ParameterResolver { return RedisStanalone.class; } + static class NewableLazy extends Lazy { + + private final Supplier supplier; + + private NewableLazy(Supplier supplier) { + super(supplier); + this.supplier = supplier; + } + + public static NewableLazy of(Supplier supplier) { + return new NewableLazy<>(supplier); + } + + public T getNew() { + return supplier.get(); + } + } + static class ManagedJedisConnectionFactory extends JedisConnectionFactory implements ConnectionFactoryTracker.Managed { diff --git a/src/test/java/org/springframework/data/redis/listener/PubSubTestParams.java b/src/test/java/org/springframework/data/redis/listener/PubSubTestParams.java index 9d57cc5f6..1f7e109ae 100644 --- a/src/test/java/org/springframework/data/redis/listener/PubSubTestParams.java +++ b/src/test/java/org/springframework/data/redis/listener/PubSubTestParams.java @@ -47,7 +47,7 @@ public class PubSubTestParams { ObjectFactory rawFactory = new RawObjectFactory(); JedisConnectionFactory jedisConnFactory = JedisConnectionFactoryExtension - .getConnectionFactory(RedisStanalone.class); + .getNewConnectionFactory(RedisStanalone.class); jedisConnFactory.afterPropertiesSet(); @@ -84,7 +84,7 @@ public class PubSubTestParams { // add Jedis JedisConnectionFactory jedisClusterFactory = JedisConnectionFactoryExtension - .getConnectionFactory(RedisCluster.class); + .getNewConnectionFactory(RedisCluster.class); RedisTemplate jedisClusterStringTemplate = new StringRedisTemplate(jedisClusterFactory);