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());
+ }
+ }
+}