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