diff --git a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/keyval/RedisConnectionFactoryCreator.java b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/keyval/RedisConnectionFactoryCreator.java index 7b64669..cb1a720 100644 --- a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/keyval/RedisConnectionFactoryCreator.java +++ b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/keyval/RedisConnectionFactoryCreator.java @@ -13,13 +13,14 @@ import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.jedis.JedisClientConfiguration; import org.springframework.data.redis.connection.jedis.JedisClientConfiguration.JedisClientConfigurationBuilder; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; +import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration.LettuceClientConfigurationBuilder; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration; -import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder; /** * Simplified access to creating Redis service objects. - * Supports Jedis and lettuce Redis clients. + * Supports Jedis and Lettuce Redis clients. * * @author Ramnivas Laddad * @author Jennifer Hickey @@ -31,6 +32,7 @@ public class RedisConnectionFactoryCreator extends AbstractServiceConnectorCreat private static final String JEDIS_CLASS_NAME = "redis.clients.jedis.Jedis"; private static final String LETTUCE_CLASS_NAME = "io.lettuce.core.RedisClient"; + private static final String APACHE_COMMONS_POOL_CLASS_NAME = "org.apache.commons.pool2.impl.GenericObjectPoolConfig"; @Override public RedisConnectionFactory create(RedisServiceInfo serviceInfo, ServiceConnectorConfig serviceConnectorConfig) { @@ -54,7 +56,18 @@ public class RedisConnectionFactoryCreator extends AbstractServiceConnectorCreat return connectionFactory; } else if (hasClass(LETTUCE_CLASS_NAME)) { - LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder(); + LettuceClientConfigurationBuilder builder; + if (serviceConnectorConfig != null && ((PooledServiceConnectorConfig) serviceConnectorConfig).getPoolConfig() != null) { + if (!hasClass(APACHE_COMMONS_POOL_CLASS_NAME)) { + throw new ServiceConnectorCreationException(String.format("Failed to create cloud Redis " + + "connection factory for %s service. Apache Commons Pool must be available on " + + "the classpath if pooling parameters are provided.", serviceInfo.getId())); + } + + builder = LettucePoolingClientConfiguration.builder(); + } else { + builder = LettuceClientConfiguration.builder(); + } RedisLettuceClientConfigurer clientConfigurer = new RedisLettuceClientConfigurer(); if (serviceConnectorConfig instanceof RedisConnectionFactoryConfig) { @@ -68,10 +81,10 @@ public class RedisConnectionFactoryCreator extends AbstractServiceConnectorCreat return connectionFactory; } else { - throw new ServiceConnectorCreationException(String.format("Failed to create cloud Redis connection factory " + - "for %s service. No client implementation classes " - + " of jedis or lettuce clients implementation (%s, %s) not found", serviceInfo.getId(), - JEDIS_CLASS_NAME, LETTUCE_CLASS_NAME)); + throw new ServiceConnectorCreationException(String.format("Failed to create cloud Redis " + + "connection factory for %s service. No client implementation classes " + + " of Jedis or Lettuce clients implementation (%s, %s) not found", + serviceInfo.getId(), JEDIS_CLASS_NAME, LETTUCE_CLASS_NAME)); } } } diff --git a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/keyval/RedisJedisClientConfigurer.java b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/keyval/RedisJedisClientConfigurer.java index 289b392..5877f67 100644 --- a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/keyval/RedisJedisClientConfigurer.java +++ b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/keyval/RedisJedisClientConfigurer.java @@ -18,7 +18,7 @@ import org.springframework.data.redis.connection.jedis.JedisClientConfiguration. */ public class RedisJedisClientConfigurer implements ServiceConnectorConfigurer { private MapServiceConnectionConfigurer mapClientConfigurer = - new MapServiceConnectionConfigurer(); + new MapServiceConnectionConfigurer<>(); @Override public JedisClientConfigurationBuilder configure(JedisClientConfigurationBuilder clientConfiguration, RedisConnectionFactoryConfig config) { diff --git a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/keyval/RedisLettuceClientConfigurer.java b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/keyval/RedisLettuceClientConfigurer.java index af96ef5..768e8bb 100644 --- a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/keyval/RedisLettuceClientConfigurer.java +++ b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/keyval/RedisLettuceClientConfigurer.java @@ -1,6 +1,7 @@ package org.springframework.cloud.service.keyval; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; +import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration.LettuceClientConfigurationBuilder; import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder; import org.springframework.beans.BeanWrapper; @@ -16,12 +17,12 @@ import org.springframework.cloud.service.Util; * @author Scott Frederick * */ -public class RedisLettuceClientConfigurer implements ServiceConnectorConfigurer { - private MapServiceConnectionConfigurer mapClientConfigurer = - new MapServiceConnectionConfigurer(); +public class RedisLettuceClientConfigurer implements ServiceConnectorConfigurer { + private MapServiceConnectionConfigurer mapClientConfigurer = + new MapServiceConnectionConfigurer<>(); @Override - public LettucePoolingClientConfigurationBuilder configure(LettucePoolingClientConfigurationBuilder clientConfiguration, RedisConnectionFactoryConfig config) { + public LettuceClientConfigurationBuilder configure(LettuceClientConfigurationBuilder clientConfiguration, RedisConnectionFactoryConfig config) { if (config != null) { configurePool(clientConfiguration, config); configureClient(clientConfiguration, config); @@ -29,25 +30,25 @@ public class RedisLettuceClientConfigurer implements ServiceConnectorConfigurer< return clientConfiguration; } - public LettucePoolingClientConfigurationBuilder configure(LettucePoolingClientConfigurationBuilder clientConfiguration, PooledServiceConnectorConfig config) { + public LettuceClientConfigurationBuilder configure(LettuceClientConfigurationBuilder clientConfiguration, PooledServiceConnectorConfig config) { if (config != null) { configurePool(clientConfiguration, config); } return clientConfiguration; } - private void configurePool(LettucePoolingClientConfigurationBuilder clientConfiguration, PooledServiceConnectorConfig config) { + private void configurePool(LettuceClientConfigurationBuilder clientConfiguration, PooledServiceConnectorConfig config) { if (config.getPoolConfig() != null) { GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); BeanWrapper target = new BeanWrapperImpl(poolConfig); BeanWrapper source = new BeanWrapperImpl(config.getPoolConfig()); Util.setCorrespondingProperties(target, source); - clientConfiguration.poolConfig(poolConfig); + ((LettucePoolingClientConfigurationBuilder) clientConfiguration).poolConfig(poolConfig); } } - private void configureClient(LettucePoolingClientConfigurationBuilder clientConfiguration, RedisConnectionFactoryConfig config) { + private void configureClient(LettuceClientConfigurationBuilder clientConfiguration, RedisConnectionFactoryConfig config) { if (config.getConnectionProperties() != null) { mapClientConfigurer.configure(clientConfiguration, config.getConnectionProperties()); } diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/RedisConnectionFactoryCloudConfigTestHelper.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/RedisConnectionFactoryCloudConfigTestHelper.java index 06a678a..dc29510 100644 --- a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/RedisConnectionFactoryCloudConfigTestHelper.java +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/RedisConnectionFactoryCloudConfigTestHelper.java @@ -7,7 +7,9 @@ import org.springframework.data.redis.connection.lettuce.LettuceClientConfigurat import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration; -import static org.junit.Assert.assertEquals; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; /** * @@ -17,27 +19,25 @@ import static org.junit.Assert.assertEquals; */ public class RedisConnectionFactoryCloudConfigTestHelper extends CommonPoolCloudConfigTestHelper { + public static void assertNoPoolProperties(RedisConnectionFactory connector) { + if (connector instanceof JedisConnectionFactory) { + assertFalse(((JedisConnectionFactory) connector).getUsePool()); + } else if (connector instanceof LettuceConnectionFactory) { + LettuceClientConfiguration config = ((LettuceConnectionFactory) connector).getClientConfiguration(); + assertThat(config, instanceOf(LettuceClientConfiguration.class)); + } + } + public static void assertPoolProperties(RedisConnectionFactory connector, int maxActive, int minIdle, long maxWait) { GenericObjectPoolConfig poolConfig = null; if (connector instanceof JedisConnectionFactory) { poolConfig = ((JedisConnectionFactory) connector).getPoolConfig(); } else if (connector instanceof LettuceConnectionFactory) { LettuceClientConfiguration config = ((LettuceConnectionFactory) connector).getClientConfiguration(); - if (config instanceof LettucePoolingClientConfiguration) { - poolConfig = ((LettucePoolingClientConfiguration) config).getPoolConfig(); - } + assertThat(config, instanceOf(LettucePoolingClientConfiguration.class)); + poolConfig = ((LettucePoolingClientConfiguration) config).getPoolConfig(); } assertCommonsPoolProperties(poolConfig, maxActive, minIdle, maxWait); } - public static void assertConnectionProperties(RedisConnectionFactory connector, int timeout) { - if (connector instanceof JedisConnectionFactory) { - JedisConnectionFactory connectionFactory = (JedisConnectionFactory) connector; - assertEquals(timeout, connectionFactory.getTimeout()); - } else if (connector instanceof LettuceConnectionFactory) { - LettuceConnectionFactory connectionFactory = (LettuceConnectionFactory) connector; - assertEquals(timeout, connectionFactory.getTimeout()); - } - } - } diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/RedisConnectionFactoryJavaConfigTest.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/RedisConnectionFactoryJavaConfigTest.java index 2c69c3b..4291b26 100644 --- a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/RedisConnectionFactoryJavaConfigTest.java +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/RedisConnectionFactoryJavaConfigTest.java @@ -27,6 +27,16 @@ public class RedisConnectionFactoryJavaConfigTest extends AbstractServiceJavaCon return RedisConnectionFactory.class; } + @Test + public void cloudRedisConnectionFactoryWithNoPool() { + ApplicationContext testContext = + getTestApplicationContext(RedisConnectionFactoryConfigWithServiceConfig.class, + createService("my-service")); + + RedisConnectionFactory connector = testContext.getBean("noPool", getConnectorType()); + RedisConnectionFactoryCloudConfigTestHelper.assertNoPoolProperties(connector); + } + @Test public void cloudRedisConnectionFactoryWithMaxPool() { ApplicationContext testContext = @@ -63,6 +73,11 @@ class RedisConnectionFactoryConfigWithoutId extends AbstractCloudConfig { } class RedisConnectionFactoryConfigWithServiceConfig extends AbstractCloudConfig { + @Bean + public RedisConnectionFactory noPool() { + return connectionFactory().redisConnectionFactory("my-service", null); + } + @Bean public RedisConnectionFactory pool20Wait200() { PoolConfig poolConfig = new PoolConfig(20, 200);