Allow RedisConnectionFactories to be initialized as part of the context lifecycle.

Lettuce and Jedis connection factories now can be configured to initialize early during afterPropertiesSet or configured whether the component should be auto-started by the container.

By default, connection factories auto-startup early.

Closes #2866
Original Pull Request: #2868
This commit is contained in:
Mark Paluch
2024-03-13 15:05:14 +01:00
committed by Christoph Strobl
parent 779a0126e5
commit 7a94beb467
4 changed files with 180 additions and 45 deletions

View File

@@ -35,6 +35,7 @@ import javax.net.ssl.SSLSocketFactory;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.jupiter.api.Test;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
@@ -337,6 +338,21 @@ class JedisConnectionFactoryUnitTests {
assertThat(connectionFactory.isRunning()).isTrue();
}
@Test // GH-2866
void earlyStartupDoesNotStartConnectionFactory() {
JedisConnectionFactory connectionFactory = new JedisConnectionFactory(new JedisPoolConfig());
connectionFactory.setEarlyStartup(false);
connectionFactory.afterPropertiesSet();
assertThat(connectionFactory.isEarlyStartup()).isFalse();
assertThat(connectionFactory.isAutoStartup()).isTrue();
assertThat(connectionFactory.isRunning()).isFalse();
assertThat(ReflectionTestUtils.getField(connectionFactory, "pool")).isNull();
}
private JedisConnectionFactory initSpyedConnectionFactory(RedisSentinelConfiguration sentinelConfiguration,
@Nullable JedisPoolConfig poolConfig) {

View File

@@ -1260,6 +1260,22 @@ class LettuceConnectionFactoryUnitTests {
.extracting(RedisStandaloneConfiguration::getPort).isEqualTo(6789);
}
@Test // GH-2866
void earlyStartupDoesNotStartConnectionFactory() {
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(new RedisStandaloneConfiguration(),
LettuceTestClientConfiguration.defaultConfiguration());
connectionFactory.setEarlyStartup(false);
connectionFactory.afterPropertiesSet();
assertThat(connectionFactory.isEarlyStartup()).isFalse();
assertThat(connectionFactory.isAutoStartup()).isTrue();
assertThat(connectionFactory.isRunning()).isFalse();
AbstractRedisClient client = (AbstractRedisClient) getField(connectionFactory, "client");
assertThat(client).isNull();
}
static class CustomRedisConfiguration implements RedisConfiguration, WithHostAndPort {
private String hostName;