diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/JedisClientConfiguration.java b/src/main/java/org/springframework/data/redis/connection/jedis/JedisClientConfiguration.java
index 9ab7071af..a772da165 100644
--- a/src/main/java/org/springframework/data/redis/connection/jedis/JedisClientConfiguration.java
+++ b/src/main/java/org/springframework/data/redis/connection/jedis/JedisClientConfiguration.java
@@ -42,6 +42,7 @@ import org.springframework.util.Assert;
*
Optional {@link HostnameVerifier}
* Whether to use connection-pooling
* Optional {@link GenericObjectPoolConfig}
+ * Optional client name
* Connect {@link Duration timeout}
* Read {@link Duration timeout}
*
diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/DefaultLettuceClientConfiguration.java b/src/main/java/org/springframework/data/redis/connection/lettuce/DefaultLettuceClientConfiguration.java
index 8e4b29e8d..75eb97624 100644
--- a/src/main/java/org/springframework/data/redis/connection/lettuce/DefaultLettuceClientConfiguration.java
+++ b/src/main/java/org/springframework/data/redis/connection/lettuce/DefaultLettuceClientConfiguration.java
@@ -37,23 +37,26 @@ class DefaultLettuceClientConfiguration implements LettuceClientConfiguration {
private final boolean startTls;
private final Optional clientResources;
private final Optional clientOptions;
+ private final Optional clientName;
private final Duration timeout;
private final Duration shutdownTimeout;
DefaultLettuceClientConfiguration(boolean useSsl, boolean verifyPeer, boolean startTls,
- @Nullable ClientResources clientResources, @Nullable ClientOptions clientOptions, Duration timeout,
- Duration shutdownTimeout) {
+ @Nullable ClientResources clientResources, @Nullable ClientOptions clientOptions, @Nullable String clientName,
+ Duration timeout, Duration shutdownTimeout) {
this.useSsl = useSsl;
this.verifyPeer = verifyPeer;
this.startTls = startTls;
this.clientResources = Optional.ofNullable(clientResources);
this.clientOptions = Optional.ofNullable(clientOptions);
+ this.clientName = Optional.ofNullable(clientName);
this.timeout = timeout;
this.shutdownTimeout = shutdownTimeout;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
* @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration#useSsl()
*/
@Override
@@ -61,7 +64,8 @@ class DefaultLettuceClientConfiguration implements LettuceClientConfiguration {
return useSsl;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
* @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration#isVerifyPeer()
*/
@Override
@@ -69,7 +73,8 @@ class DefaultLettuceClientConfiguration implements LettuceClientConfiguration {
return verifyPeer;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
* @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration#isStartTls()
*/
@Override
@@ -77,7 +82,8 @@ class DefaultLettuceClientConfiguration implements LettuceClientConfiguration {
return startTls;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
* @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration#getClientResources()
*/
@Override
@@ -85,7 +91,8 @@ class DefaultLettuceClientConfiguration implements LettuceClientConfiguration {
return clientResources;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
* @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration#getClientOptions()
*/
@Override
@@ -93,7 +100,17 @@ class DefaultLettuceClientConfiguration implements LettuceClientConfiguration {
return clientOptions;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration#getClientName()
+ */
+ @Override
+ public Optional getClientName() {
+ return clientName;
+ }
+
+ /*
+ * (non-Javadoc)
* @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration#getTimeout()
*/
@Override
@@ -101,7 +118,8 @@ class DefaultLettuceClientConfiguration implements LettuceClientConfiguration {
return timeout;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
* @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration#getShutdownTimeout()
*/
@Override
diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePoolingClientConfiguration.java b/src/main/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePoolingClientConfiguration.java
index 6f6235ea3..d5abb2b38 100644
--- a/src/main/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePoolingClientConfiguration.java
+++ b/src/main/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePoolingClientConfiguration.java
@@ -87,6 +87,15 @@ class DefaultLettucePoolingClientConfiguration implements LettucePoolingClientCo
return clientConfiguration.getClientOptions();
}
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration#getClientName()
+ */
+ @Override
+ public Optional getClientName() {
+ return clientConfiguration.getClientName();
+ }
+
/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration#getCommandTimeout()
diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfiguration.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfiguration.java
index 2ba97e039..c884518ed 100644
--- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfiguration.java
+++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfiguration.java
@@ -37,6 +37,7 @@ import org.springframework.util.Assert;
* Whether to use StartTLS
* Optional {@link ClientResources}
* Optional {@link ClientOptions}
+ * Optional client name
* Client {@link Duration timeout}
* Shutdown {@link Duration timeout}
*
@@ -75,6 +76,12 @@ public interface LettuceClientConfiguration {
*/
Optional getClientOptions();
+ /**
+ * @return the optional client name to be set with {@code CLIENT SETNAME}.
+ * @since 2.1
+ */
+ Optional getClientName();
+
/**
* @return the timeout.
*/
@@ -109,6 +116,8 @@ public interface LettuceClientConfiguration {
* none
* Client Resources
* none
+ * Client name
+ * none
* Connect Timeout
* 60 Seconds
* Shutdown Timeout
@@ -132,6 +141,7 @@ public interface LettuceClientConfiguration {
boolean startTls;
@Nullable ClientResources clientResources;
@Nullable ClientOptions clientOptions;
+ @Nullable String clientName;
Duration timeout = Duration.ofSeconds(RedisURI.DEFAULT_TIMEOUT);
Duration shutdownTimeout = Duration.ofMillis(100);
@@ -178,6 +188,21 @@ public interface LettuceClientConfiguration {
return this;
}
+ /**
+ * Configure a {@code clientName} to be set with {@code CLIENT SETNAME}.
+ *
+ * @param clientName must not be {@literal null} or empty.
+ * @return {@literal this} builder.
+ * @throws IllegalArgumentException if clientName is {@literal null}.
+ */
+ public LettuceClientConfigurationBuilder clientName(String clientName) {
+
+ Assert.hasText(clientName, "Client name must not be null or empty!");
+
+ this.clientName = clientName;
+ return this;
+ }
+
/**
* Configure a command timeout.
*
@@ -216,7 +241,7 @@ public interface LettuceClientConfiguration {
public LettuceClientConfiguration build() {
return new DefaultLettuceClientConfiguration(useSsl, verifyPeer, startTls, clientResources, clientOptions,
- timeout, shutdownTimeout);
+ clientName, timeout, shutdownTimeout);
}
}
diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java
index 9c93cd6d1..33a5900a4 100644
--- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java
+++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java
@@ -586,6 +586,30 @@ public class LettuceConnectionFactory
standaloneConfig.setDatabase(index);
}
+ /**
+ * Returns the client name.
+ *
+ * @return the client name.
+ * @since 2.1
+ */
+ @Nullable
+ public String getClientName() {
+ return clientConfiguration.getClientName().orElse(null);
+ }
+
+ /**
+ * Sets the client name used by this connection factory. Defaults to none which does not set a client name.
+ *
+ * @param clientName the client name.
+ * @since 2.1
+ * @deprecated configure the client name using {@link LettuceClientConfiguration}.
+ * @throws IllegalStateException if {@link JedisClientConfiguration} is immutable.
+ */
+ @Deprecated
+ public void setClientName(String clientName) {
+ this.getMutableConfiguration().setClientName(clientName);
+ }
+
/**
* Returns the password used for authenticating with the Redis server.
*
@@ -849,6 +873,7 @@ public class LettuceConnectionFactory
RedisURI redisUri = LettuceConverters.sentinelConfigurationToRedisURI(sentinelConfiguration);
getRedisPassword().toOptional().ifPresent(redisUri::setPassword);
+ clientConfiguration.getClientName().ifPresent(redisUri::setClientName);
redisUri.setTimeout(clientConfiguration.getCommandTimeout());
return redisUri;
@@ -859,6 +884,7 @@ public class LettuceConnectionFactory
RedisURI.Builder builder = RedisURI.Builder.redis(host, port);
getRedisPassword().toOptional().ifPresent(builder::withPassword);
+ clientConfiguration.getClientName().ifPresent(builder::withClientName);
builder.withSsl(clientConfiguration.isUseSsl());
builder.withVerifyPeer(clientConfiguration.isVerifyPeer());
@@ -897,6 +923,7 @@ public class LettuceConnectionFactory
private boolean verifyPeer = true;
private boolean startTls;
private @Nullable ClientResources clientResources;
+ private @Nullable String clientName;
private Duration timeout = Duration.ofSeconds(RedisURI.DEFAULT_TIMEOUT);
private Duration shutdownTimeout = Duration.ofMillis(100);
@@ -908,7 +935,7 @@ public class LettuceConnectionFactory
return useSsl;
}
- public void setUseSsl(boolean useSsl) {
+ void setUseSsl(boolean useSsl) {
this.useSsl = useSsl;
}
@@ -920,7 +947,7 @@ public class LettuceConnectionFactory
return verifyPeer;
}
- public void setVerifyPeer(boolean verifyPeer) {
+ void setVerifyPeer(boolean verifyPeer) {
this.verifyPeer = verifyPeer;
}
@@ -932,7 +959,7 @@ public class LettuceConnectionFactory
return startTls;
}
- public void setStartTls(boolean startTls) {
+ void setStartTls(boolean startTls) {
this.startTls = startTls;
}
@@ -944,7 +971,7 @@ public class LettuceConnectionFactory
return Optional.ofNullable(clientResources);
}
- public void setClientResources(ClientResources clientResources) {
+ void setClientResources(ClientResources clientResources) {
this.clientResources = clientResources;
}
@@ -956,6 +983,19 @@ public class LettuceConnectionFactory
return Optional.empty();
}
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration#getClientName()
+ */
+ @Override
+ public Optional getClientName() {
+ return Optional.ofNullable(clientName);
+ }
+
+ void setClientName(String clientName) {
+ this.clientName = clientName;
+ }
+
/* (non-Javadoc)
* @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration#getTimeout()
*/
@@ -964,7 +1004,7 @@ public class LettuceConnectionFactory
return timeout;
}
- public void setTimeout(Duration timeout) {
+ void setTimeout(Duration timeout) {
this.timeout = timeout;
}
@@ -976,7 +1016,7 @@ public class LettuceConnectionFactory
return shutdownTimeout;
}
- public void setShutdownTimeout(Duration shutdownTimeout) {
+ void setShutdownTimeout(Duration shutdownTimeout) {
this.shutdownTimeout = shutdownTimeout;
}
}
diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactorySentinelIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactorySentinelIntegrationTests.java
index 98e3fb97d..64e2de859 100644
--- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactorySentinelIntegrationTests.java
+++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactorySentinelIntegrationTests.java
@@ -48,7 +48,7 @@ public class JedisConnectionFactorySentinelIntegrationTests {
}
@Test // DATAREDIS-574
- public void shouldInitiaizeWithSentinelConfiguration() {
+ public void shouldInitializeWithSentinelConfiguration() {
JedisClientConfiguration clientConfiguration = JedisClientConfiguration.builder() //
.clientName("clientName") //
diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfigurationUnitTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfigurationUnitTests.java
index 6babd663d..051a78de2 100644
--- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfigurationUnitTests.java
+++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfigurationUnitTests.java
@@ -32,7 +32,7 @@ import org.junit.Test;
*/
public class LettuceClientConfigurationUnitTests {
- @Test // DATAREDIS-574, DATAREDIS-667
+ @Test // DATAREDIS-574, DATAREDIS-576, DATAREDIS-667
public void shouldCreateEmptyConfiguration() {
LettuceClientConfiguration configuration = LettuceClientConfiguration.defaultConfiguration();
@@ -42,11 +42,12 @@ public class LettuceClientConfigurationUnitTests {
assertThat(configuration.isStartTls()).isFalse();
assertThat(configuration.getClientOptions()).isEmpty();
assertThat(configuration.getClientResources()).isEmpty();
+ assertThat(configuration.getClientName()).isEmpty();
assertThat(configuration.getCommandTimeout()).isEqualTo(Duration.ofSeconds(60));
assertThat(configuration.getShutdownTimeout()).isEqualTo(Duration.ofMillis(100));
}
- @Test // DATAREDIS-574, DATAREDIS-667
+ @Test // DATAREDIS-574, DATAREDIS-576, DATAREDIS-667
public void shouldConfigureAllProperties() {
ClientOptions clientOptions = ClientOptions.create();
@@ -58,6 +59,7 @@ public class LettuceClientConfigurationUnitTests {
.startTls().and() //
.clientOptions(clientOptions) //
.clientResources(sharedClientResources) //
+ .clientName("foo") //
.commandTimeout(Duration.ofMinutes(5)) //
.shutdownTimeout(Duration.ofHours(2)) //
.build();
@@ -67,6 +69,7 @@ public class LettuceClientConfigurationUnitTests {
assertThat(configuration.isStartTls()).isTrue();
assertThat(configuration.getClientOptions()).contains(clientOptions);
assertThat(configuration.getClientResources()).contains(sharedClientResources);
+ assertThat(configuration.getClientName()).contains("foo");
assertThat(configuration.getCommandTimeout()).isEqualTo(Duration.ofMinutes(5));
assertThat(configuration.getShutdownTimeout()).isEqualTo(Duration.ofHours(2));
}
diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryTests.java
index 05438c92b..4215073ec 100644
--- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryTests.java
+++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryTests.java
@@ -361,4 +361,38 @@ public class LettuceConnectionFactoryTests {
factory.destroy();
}
+
+ @Test // DATAREDIS-576
+ public void connectionAppliesClientName() {
+
+ LettuceClientConfiguration configuration = LettuceClientConfiguration.builder()
+ .clientResources(LettuceTestClientResources.getSharedClientResources()).clientName("clientName").build();
+
+ LettuceConnectionFactory factory = new LettuceConnectionFactory(new RedisStandaloneConfiguration(), configuration);
+ factory.setShareNativeConnection(false);
+ factory.afterPropertiesSet();
+
+ RedisConnection connection = factory.getConnection();
+
+ assertThat(connection.getClientName(), is(equalTo("clientName")));
+ connection.close();
+
+ factory.destroy();
+ }
+
+ @Test // DATAREDIS-576
+ public void getClientNameShouldEqualWithFactorySetting() {
+
+ LettuceConnectionFactory factory = new LettuceConnectionFactory(new RedisStandaloneConfiguration());
+ factory.setClientResources(LettuceTestClientResources.getSharedClientResources());
+ factory.setClientName("clientName");
+ factory.afterPropertiesSet();
+
+ RedisConnection connection = factory.getConnection();
+ assertThat(connection.getClientName(), equalTo("clientName"));
+
+ connection.close();
+
+ factory.destroy();
+ }
}
diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceSentinelIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceSentinelIntegrationTests.java
index 50bf7129a..99d0c56cb 100644
--- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceSentinelIntegrationTests.java
+++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceSentinelIntegrationTests.java
@@ -43,6 +43,8 @@ import org.springframework.data.redis.test.util.MinimumRedisVersionRule;
import org.springframework.data.redis.test.util.RedisSentinelRule;
/**
+ * Integration tests for Lettuce and Redis Sentinel interaction.
+ *
* @author Mark Paluch
* @author Christoph Strobl
*/
@@ -148,4 +150,24 @@ public class LettuceSentinelIntegrationTests extends AbstractConnectionIntegrati
connection.close();
}
}
+
+ @Test // DATAREDIS-576
+ public void connectionAppliesClientName() {
+
+ LettuceClientConfiguration clientName = LettuceClientConfiguration.builder()
+ .clientResources(LettuceTestClientResources.getSharedClientResources()).clientName("clientName").build();
+
+ LettuceConnectionFactory factory = new LettuceConnectionFactory(SENTINEL_CONFIG, clientName);
+ factory.afterPropertiesSet();
+
+ ConnectionFactoryTracker.add(factory);
+
+ StringRedisConnection connection = new DefaultStringRedisConnection(factory.getConnection());
+
+ try {
+ assertThat(connection.getClientName(), is(equalTo("clientName")));
+ } finally {
+ connection.close();
+ }
+ }
}