diff --git a/build.gradle b/build.gradle index 6e0dcd0..ee408ad 100644 --- a/build.gradle +++ b/build.gradle @@ -23,6 +23,7 @@ ext { springDataMongoVersion = "1.4.3.RELEASE" jedisVersion = "2.1.0" + lettuceVersion = "3.4.3.Final" commonDbcpVersion = "1.4" commonDbcp2Version = "2.0" diff --git a/spring-cloud-heroku-connector/src/main/java/org/springframework/cloud/heroku/HerokuConnector.java b/spring-cloud-heroku-connector/src/main/java/org/springframework/cloud/heroku/HerokuConnector.java index 6dd5a05..a0eb93a 100644 --- a/spring-cloud-heroku-connector/src/main/java/org/springframework/cloud/heroku/HerokuConnector.java +++ b/spring-cloud-heroku-connector/src/main/java/org/springframework/cloud/heroku/HerokuConnector.java @@ -18,7 +18,7 @@ import org.springframework.cloud.util.EnvironmentAccessor; /** * Implementation of CloudConnector for Heroku - *

+ * * Currently support Postgres (default provided), Mysql (Cleardb), MongoDb (MongoLab, MongoHQ, MongoSoup), * Redis (RedisToGo, RedisCloud, OpenRedis, RedisGreen), and AMQP (CloudAmqp). * @@ -98,4 +98,4 @@ public class HerokuConnector extends AbstractCloudConnector protected FallbackServiceInfoCreator getFallbackServiceInfoCreator() { return new FallbackBaseServiceInfoCreator(); } -} \ No newline at end of file +} diff --git a/spring-cloud-spring-service-connector/build.gradle b/spring-cloud-spring-service-connector/build.gradle index ca7d8a3..c28d5ef 100644 --- a/spring-cloud-spring-service-connector/build.gradle +++ b/spring-cloud-spring-service-connector/build.gradle @@ -28,6 +28,7 @@ dependencies { exclude(group: 'org.springframework', module: 'spring-context-support') } optional("redis.clients:jedis:$jedisVersion") + optional("biz.paluch.redis:lettuce:$lettuceVersion") optional("org.springframework.data:spring-data-mongodb:$springDataMongoVersion") { exclude(group: 'org.springframework', module: 'spring-beans') 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 e332f79..b5fac9e 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 @@ -9,39 +9,62 @@ import org.springframework.cloud.service.ServiceConnectorCreationException; import org.springframework.cloud.service.common.RedisServiceInfo; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; /** * Simplified access to creating Redis service objects. + * Supports Jedis and lettuce Redis clients. * * @author Ramnivas Laddad * @author Jennifer Hickey * @author Thomas Risberg - * + * @author Mark Paluch */ public class RedisConnectionFactoryCreator extends AbstractServiceConnectorCreator { - private static final String REDIS_CLIENT_CLASS_NAME = "redis.clients.jedis.Jedis"; - - RedisConnectionFactoryConfigurer configurer = new RedisConnectionFactoryConfigurer(); + private static final String JEDIS_CLASS_NAME = "redis.clients.jedis.Jedis"; + private static final String LETTUCE_CLASS_NAME = "com.lambdaworks.redis.RedisClient"; @Override public RedisConnectionFactory create(RedisServiceInfo serviceInfo, ServiceConnectorConfig serviceConnectorConfig) { - if (hasClass(REDIS_CLIENT_CLASS_NAME)) { + + if (hasClass(JEDIS_CLASS_NAME)) { + + RedisConnectionFactoryConfigurer configurer = new RedisConnectionFactoryConfigurer(); + JedisConnectionFactory connectionFactory = new JedisConnectionFactory(); connectionFactory.setHostName(serviceInfo.getHost()); connectionFactory.setPort(serviceInfo.getPort()); connectionFactory.setPassword(serviceInfo.getPassword()); + if (serviceConnectorConfig instanceof RedisConnectionFactoryConfig) { configurer.configure(connectionFactory, (RedisConnectionFactoryConfig) serviceConnectorConfig); } else { configurer.configure(connectionFactory, (PooledServiceConnectorConfig) serviceConnectorConfig); } + connectionFactory.afterPropertiesSet(); return connectionFactory; - } else { - throw new ServiceConnectorCreationException("Failed to create cloud Redis connection factory for " - + serviceInfo.getId() + " service. Jedis client implementation class (" - + REDIS_CLIENT_CLASS_NAME + ") not found"); + } + else if (hasClass(LETTUCE_CLASS_NAME)) { + + RedisLettuceConnectionFactoryConfigurer configurer = new RedisLettuceConnectionFactoryConfigurer(); + + LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(); + connectionFactory.setHostName(serviceInfo.getHost()); + connectionFactory.setPort(serviceInfo.getPort()); + connectionFactory.setPassword(serviceInfo.getPassword()); + + configurer.configure(connectionFactory, (RedisConnectionFactoryConfig) serviceConnectorConfig); + + connectionFactory.afterPropertiesSet(); + 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)); } } } diff --git a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/keyval/RedisLettuceConnectionFactoryConfigurer.java b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/keyval/RedisLettuceConnectionFactoryConfigurer.java new file mode 100644 index 0000000..ec613f3 --- /dev/null +++ b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/keyval/RedisLettuceConnectionFactoryConfigurer.java @@ -0,0 +1,28 @@ +package org.springframework.cloud.service.keyval; + +import org.springframework.cloud.service.*; + +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; + +/** + * + * @author Mark Paluch + */ +public class RedisLettuceConnectionFactoryConfigurer implements ServiceConnectorConfigurer { + private MapServiceConnectionConfigurer mapServiceConnectionConfigurer = + new MapServiceConnectionConfigurer(); + + @Override + public LettuceConnectionFactory configure(LettuceConnectionFactory connectionFactory, RedisConnectionFactoryConfig config) { + if (config != null) { + configureConnection(connectionFactory, config); + } + return connectionFactory; + } + + private void configureConnection(LettuceConnectionFactory connectionFactory, RedisConnectionFactoryConfig config) { + if (config.getConnectionProperties() != null) { + mapServiceConnectionConfigurer.configure(connectionFactory, config.getConnectionProperties()); + } + } +}