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.
This commit is contained in:
Mark Paluch
2020-11-11 10:25:08 +01:00
parent 3823da8f18
commit 79e9ad310e
2 changed files with 38 additions and 8 deletions

View File

@@ -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<JedisConnectionFactory> STANDALONE = Lazy.of(() -> {
private static final NewableLazy<JedisConnectionFactory> 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<JedisConnectionFactory> SENTINEL = Lazy.of(() -> {
private static final NewableLazy<JedisConnectionFactory> 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<JedisConnectionFactory> CLUSTER = Lazy.of(() -> {
private static final NewableLazy<JedisConnectionFactory> 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<Class<?>, Lazy<JedisConnectionFactory>> factories;
private static final Map<Class<?>, NewableLazy<JedisConnectionFactory>> 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<? extends Annotation> 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<T> extends Lazy<T> {
private final Supplier<? extends T> supplier;
private NewableLazy(Supplier<? extends T> supplier) {
super(supplier);
this.supplier = supplier;
}
public static <T> NewableLazy<T> of(Supplier<? extends T> supplier) {
return new NewableLazy<>(supplier);
}
public T getNew() {
return supplier.get();
}
}
static class ManagedJedisConnectionFactory extends JedisConnectionFactory
implements ConnectionFactoryTracker.Managed {

View File

@@ -47,7 +47,7 @@ public class PubSubTestParams {
ObjectFactory<byte[]> 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<String, String> jedisClusterStringTemplate = new StringRedisTemplate(jedisClusterFactory);