Rework Lettuce configuration to use new client pooling config API
Closes gh-9538
This commit is contained in:
parent
02bc73b8e1
commit
6671a19cef
|
|
@ -31,21 +31,23 @@ import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
|
||||||
import org.springframework.beans.factory.ObjectProvider;
|
import org.springframework.beans.factory.ObjectProvider;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
|
import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Pool;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.data.redis.connection.RedisClusterConfiguration;
|
import org.springframework.data.redis.connection.RedisClusterConfiguration;
|
||||||
import org.springframework.data.redis.connection.RedisConnectionFactory;
|
import org.springframework.data.redis.connection.RedisConnectionFactory;
|
||||||
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
|
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
|
||||||
import org.springframework.data.redis.connection.lettuce.DefaultLettucePool;
|
|
||||||
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
|
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
|
||||||
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration.LettuceClientConfigurationBuilder;
|
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration.LettuceClientConfigurationBuilder;
|
||||||
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
|
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
|
||||||
|
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Redis connection configuration using Lettuce.
|
* Redis connection configuration using Lettuce.
|
||||||
*
|
*
|
||||||
* @author Mark Paluch
|
* @author Mark Paluch
|
||||||
|
* @author Andy Wilkinson
|
||||||
*/
|
*/
|
||||||
@Configuration
|
@Configuration
|
||||||
@ConditionalOnClass({ GenericObjectPool.class, RedisClient.class,
|
@ConditionalOnClass({ GenericObjectPool.class, RedisClient.class,
|
||||||
|
|
@ -76,62 +78,10 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration {
|
||||||
@ConditionalOnMissingBean(RedisConnectionFactory.class)
|
@ConditionalOnMissingBean(RedisConnectionFactory.class)
|
||||||
public LettuceConnectionFactory redisConnectionFactory(
|
public LettuceConnectionFactory redisConnectionFactory(
|
||||||
ClientResources clientResources) throws UnknownHostException {
|
ClientResources clientResources) throws UnknownHostException {
|
||||||
if (this.properties.getLettuce().getPool() != null) {
|
LettuceClientConfiguration clientConfig;
|
||||||
return createLettuceConnectionFactory(clientResources);
|
clientConfig = getLettuceClientConfiguration(clientResources,
|
||||||
}
|
this.properties.getLettuce().getPool());
|
||||||
return createLettuceConnectionFactory(
|
return createLettuceConnectionFactory(clientConfig);
|
||||||
getLettuceClientConfiguration(clientResources));
|
|
||||||
}
|
|
||||||
|
|
||||||
private LettuceConnectionFactory createLettuceConnectionFactory(
|
|
||||||
ClientResources clientResources) {
|
|
||||||
return applyProperties(
|
|
||||||
new LettuceConnectionFactory(applyProperties(createLettucePool(),
|
|
||||||
this.properties.getLettuce().getPool(), clientResources)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
private LettuceConnectionFactory applyProperties(
|
|
||||||
LettuceConnectionFactory connectionFactory) {
|
|
||||||
connectionFactory
|
|
||||||
.setShutdownTimeout(this.properties.getLettuce().getShutdownTimeout());
|
|
||||||
return connectionFactory;
|
|
||||||
}
|
|
||||||
|
|
||||||
private DefaultLettucePool createLettucePool() {
|
|
||||||
return getSentinelConfig() != null ? new DefaultLettucePool(getSentinelConfig())
|
|
||||||
: new DefaultLettucePool();
|
|
||||||
}
|
|
||||||
|
|
||||||
private DefaultLettucePool applyProperties(DefaultLettucePool pool,
|
|
||||||
RedisProperties.Pool properties, ClientResources clientResources) {
|
|
||||||
if (StringUtils.hasText(this.properties.getUrl())) {
|
|
||||||
configureConnectionFromUrl(pool);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
pool.setHostName(this.properties.getHost());
|
|
||||||
pool.setPort(this.properties.getPort());
|
|
||||||
if (this.properties.getPassword() != null) {
|
|
||||||
pool.setPassword(this.properties.getPassword());
|
|
||||||
}
|
|
||||||
pool.setDatabase(this.properties.getDatabase());
|
|
||||||
}
|
|
||||||
if (this.properties.getTimeout() > 0) {
|
|
||||||
pool.setTimeout(this.properties.getTimeout());
|
|
||||||
}
|
|
||||||
pool.setPoolConfig(lettucePoolConfig(properties));
|
|
||||||
pool.setClientResources(clientResources);
|
|
||||||
pool.afterPropertiesSet();
|
|
||||||
return pool;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void configureConnectionFromUrl(DefaultLettucePool lettucePool) {
|
|
||||||
ConnectionInfo connectionInfo = parseUrl(this.properties.getUrl());
|
|
||||||
lettucePool.setHostName(connectionInfo.getHostName());
|
|
||||||
lettucePool.setPort(connectionInfo.getPort());
|
|
||||||
if (connectionInfo.getPassword() != null) {
|
|
||||||
lettucePool.setPassword(connectionInfo.getPassword());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static GenericObjectPoolConfig lettucePoolConfig(RedisProperties.Pool props) {
|
private static GenericObjectPoolConfig lettucePoolConfig(RedisProperties.Pool props) {
|
||||||
|
|
@ -156,9 +106,16 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration {
|
||||||
}
|
}
|
||||||
|
|
||||||
private LettuceClientConfiguration getLettuceClientConfiguration(
|
private LettuceClientConfiguration getLettuceClientConfiguration(
|
||||||
ClientResources clientResources) {
|
ClientResources clientResources, Pool pool) {
|
||||||
LettuceClientConfigurationBuilder builder = applyProperties(
|
LettuceClientConfigurationBuilder builder;
|
||||||
LettuceClientConfiguration.builder());
|
if (pool != null) {
|
||||||
|
builder = LettucePoolingClientConfiguration.builder()
|
||||||
|
.poolConfig(lettucePoolConfig(pool));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
builder = LettuceClientConfiguration.builder();
|
||||||
|
}
|
||||||
|
applyProperties(builder);
|
||||||
if (StringUtils.hasText(this.properties.getUrl())) {
|
if (StringUtils.hasText(this.properties.getUrl())) {
|
||||||
customizeConfigurationFromUrl(builder);
|
customizeConfigurationFromUrl(builder);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,9 +26,9 @@ import org.springframework.boot.test.util.TestPropertyValues;
|
||||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.data.redis.connection.lettuce.DefaultLettucePool;
|
|
||||||
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration.LettuceClientConfigurationBuilder;
|
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration.LettuceClientConfigurationBuilder;
|
||||||
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
|
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
|
||||||
|
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
|
||||||
import org.springframework.data.redis.core.RedisOperations;
|
import org.springframework.data.redis.core.RedisOperations;
|
||||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
import org.springframework.test.util.ReflectionTestUtils;
|
import org.springframework.test.util.ReflectionTestUtils;
|
||||||
|
|
@ -121,11 +121,14 @@ public class RedisAutoConfigurationTests {
|
||||||
"spring.redis.lettuce.shutdown-timeout:1000");
|
"spring.redis.lettuce.shutdown-timeout:1000");
|
||||||
LettuceConnectionFactory cf = this.context
|
LettuceConnectionFactory cf = this.context
|
||||||
.getBean(LettuceConnectionFactory.class);
|
.getBean(LettuceConnectionFactory.class);
|
||||||
assertThat(getDefaultLettucePool(cf).getHostName()).isEqualTo("foo");
|
assertThat(cf.getHostName()).isEqualTo("foo");
|
||||||
assertThat(getDefaultLettucePool(cf).getPoolConfig().getMinIdle()).isEqualTo(1);
|
assertThat(getPoolingClientConfiguration(cf).getPoolConfig().getMinIdle())
|
||||||
assertThat(getDefaultLettucePool(cf).getPoolConfig().getMaxIdle()).isEqualTo(4);
|
.isEqualTo(1);
|
||||||
assertThat(getDefaultLettucePool(cf).getPoolConfig().getMaxTotal()).isEqualTo(16);
|
assertThat(getPoolingClientConfiguration(cf).getPoolConfig().getMaxIdle())
|
||||||
assertThat(getDefaultLettucePool(cf).getPoolConfig().getMaxWaitMillis())
|
.isEqualTo(4);
|
||||||
|
assertThat(getPoolingClientConfiguration(cf).getPoolConfig().getMaxTotal())
|
||||||
|
.isEqualTo(16);
|
||||||
|
assertThat(getPoolingClientConfiguration(cf).getPoolConfig().getMaxWaitMillis())
|
||||||
.isEqualTo(2000);
|
.isEqualTo(2000);
|
||||||
assertThat(cf.getShutdownTimeout()).isEqualTo(1000);
|
assertThat(cf.getShutdownTimeout()).isEqualTo(1000);
|
||||||
}
|
}
|
||||||
|
|
@ -177,8 +180,10 @@ public class RedisAutoConfigurationTests {
|
||||||
.isEqualTo("password");
|
.isEqualTo("password");
|
||||||
}
|
}
|
||||||
|
|
||||||
private DefaultLettucePool getDefaultLettucePool(LettuceConnectionFactory factory) {
|
private LettucePoolingClientConfiguration getPoolingClientConfiguration(
|
||||||
return (DefaultLettucePool) ReflectionTestUtils.getField(factory, "pool");
|
LettuceConnectionFactory factory) {
|
||||||
|
return (LettucePoolingClientConfiguration) ReflectionTestUtils.getField(factory,
|
||||||
|
"clientConfiguration");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void load(String... environment) {
|
private void load(String... environment) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue