From d7a73e70be2bca6119162c2131bc23331bfca4e5 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 4 Oct 2017 11:12:00 -0700 Subject: [PATCH] Support Redis without commons-pool2 Update `LettuceConnectionConfiguration` so that `commons-pool2` can be an optional dependency. See gh-10480 --- .../redis/LettuceConnectionConfiguration.java | 51 +++++++++++-------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java index d5cdf4a9e9..3bdaaeaed6 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java @@ -22,10 +22,8 @@ import java.util.Collections; import java.util.List; import io.lettuce.core.RedisClient; -import io.lettuce.core.cluster.RedisClusterClient; import io.lettuce.core.resource.ClientResources; import io.lettuce.core.resource.DefaultClientResources; -import org.apache.commons.pool2.impl.GenericObjectPool; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.springframework.beans.factory.ObjectProvider; @@ -50,8 +48,7 @@ import org.springframework.util.StringUtils; * @author Andy Wilkinson */ @Configuration -@ConditionalOnClass({ GenericObjectPool.class, RedisClient.class, - RedisClusterClient.class }) +@ConditionalOnClass(RedisClient.class) class LettuceConnectionConfiguration extends RedisConnectionConfiguration { private final RedisProperties properties; @@ -84,15 +81,6 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration { return createLettuceConnectionFactory(clientConfig); } - private static GenericObjectPoolConfig lettucePoolConfig(RedisProperties.Pool props) { - GenericObjectPoolConfig config = new GenericObjectPoolConfig(); - config.setMaxTotal(props.getMaxActive()); - config.setMaxIdle(props.getMaxIdle()); - config.setMinIdle(props.getMinIdle()); - config.setMaxWaitMillis(props.getMaxWait()); - return config; - } - private LettuceConnectionFactory createLettuceConnectionFactory( LettuceClientConfiguration clientConfiguration) { if (getSentinelConfig() != null) { @@ -107,14 +95,7 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration { private LettuceClientConfiguration getLettuceClientConfiguration( ClientResources clientResources, Pool pool) { - LettuceClientConfigurationBuilder builder; - if (pool != null) { - builder = LettucePoolingClientConfiguration.builder() - .poolConfig(lettucePoolConfig(pool)); - } - else { - builder = LettuceClientConfiguration.builder(); - } + LettuceClientConfigurationBuilder builder = createBuilder(pool); applyProperties(builder); if (StringUtils.hasText(this.properties.getUrl())) { customizeConfigurationFromUrl(builder); @@ -124,6 +105,13 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration { return builder.build(); } + private LettuceClientConfigurationBuilder createBuilder(Pool pool) { + if (pool == null) { + return LettuceClientConfiguration.builder(); + } + return new PoolBuilderFactory().createBuilder(pool); + } + private LettuceClientConfigurationBuilder applyProperties( LettuceClientConfiguration.LettuceClientConfigurationBuilder builder) { if (this.properties.isSsl()) { @@ -157,4 +145,25 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration { } } + /** + * Inner class to allow optional commons-pool2 dependency. + */ + private static class PoolBuilderFactory { + + public LettuceClientConfigurationBuilder createBuilder(Pool properties) { + return LettucePoolingClientConfiguration.builder() + .poolConfig(getPoolConfig(properties)); + } + + private GenericObjectPoolConfig getPoolConfig(Pool properties) { + GenericObjectPoolConfig config = new GenericObjectPoolConfig(); + config.setMaxTotal(properties.getMaxActive()); + config.setMaxIdle(properties.getMaxIdle()); + config.setMinIdle(properties.getMinIdle()); + config.setMaxWaitMillis(properties.getMaxWait()); + return config; + } + + } + }