diff --git a/module/spring-boot-data-redis/src/main/java/org/springframework/boot/data/redis/autoconfigure/DataRedisConnectionConfiguration.java b/module/spring-boot-data-redis/src/main/java/org/springframework/boot/data/redis/autoconfigure/DataRedisConnectionConfiguration.java index 1ee59085bfd0..1229619c9074 100644 --- a/module/spring-boot-data-redis/src/main/java/org/springframework/boot/data/redis/autoconfigure/DataRedisConnectionConfiguration.java +++ b/module/spring-boot-data-redis/src/main/java/org/springframework/boot/data/redis/autoconfigure/DataRedisConnectionConfiguration.java @@ -28,6 +28,7 @@ import org.springframework.boot.data.redis.autoconfigure.DataRedisConnectionDetails.Standalone; import org.springframework.boot.data.redis.autoconfigure.DataRedisProperties.Pool; import org.springframework.boot.ssl.SslBundle; +import org.springframework.core.env.Environment; import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisNode; import org.springframework.data.redis.connection.RedisPassword; @@ -36,6 +37,7 @@ import org.springframework.data.redis.connection.RedisStaticMasterReplicaConfiguration; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; +import org.springframework.util.StringUtils; /** * Base Redis connection configuration. @@ -55,6 +57,8 @@ abstract class DataRedisConnectionConfiguration { private static final boolean COMMONS_POOL2_AVAILABLE = ClassUtils.isPresent("org.apache.commons.pool2.ObjectPool", DataRedisConnectionConfiguration.class.getClassLoader()); + private final Environment environment; + private final DataRedisProperties properties; private final @Nullable RedisStandaloneConfiguration standaloneConfiguration; @@ -69,12 +73,13 @@ abstract class DataRedisConnectionConfiguration { protected final Mode mode; - protected DataRedisConnectionConfiguration(DataRedisProperties properties, + protected DataRedisConnectionConfiguration(Environment environment, DataRedisProperties properties, DataRedisConnectionDetails connectionDetails, ObjectProvider standaloneConfigurationProvider, ObjectProvider sentinelConfigurationProvider, ObjectProvider clusterConfigurationProvider, ObjectProvider masterReplicaConfiguration) { + this.environment = environment; this.properties = properties; this.standaloneConfiguration = standaloneConfigurationProvider.getIfAvailable(); this.sentinelConfiguration = sentinelConfigurationProvider.getIfAvailable(); @@ -180,6 +185,17 @@ protected final DataRedisProperties getProperties() { return this.properties; } + protected @Nullable String determineClientName() { + String clientName = getProperties().getClientName(); + if (!StringUtils.hasText(clientName)) { + String applicationName = this.environment.getProperty("spring.application.name"); + if (StringUtils.hasText(applicationName)) { + clientName = applicationName; + } + } + return clientName; + } + protected @Nullable SslBundle getSslBundle() { return this.connectionDetails.getSslBundle(); } diff --git a/module/spring-boot-data-redis/src/main/java/org/springframework/boot/data/redis/autoconfigure/JedisConnectionConfiguration.java b/module/spring-boot-data-redis/src/main/java/org/springframework/boot/data/redis/autoconfigure/JedisConnectionConfiguration.java index 3ec5e555319f..2a6a367da068 100644 --- a/module/spring-boot-data-redis/src/main/java/org/springframework/boot/data/redis/autoconfigure/JedisConnectionConfiguration.java +++ b/module/spring-boot-data-redis/src/main/java/org/springframework/boot/data/redis/autoconfigure/JedisConnectionConfiguration.java @@ -33,6 +33,7 @@ import org.springframework.boot.thread.Threading; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisConnectionFactory; @@ -56,6 +57,7 @@ * @author Andy Wilkinson * @author Phillip Webb * @author Scott Frederick + * @author Yanming Zhou */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass({ GenericObjectPool.class, JedisConnection.class, Jedis.class }) @@ -63,13 +65,13 @@ @ConditionalOnProperty(name = "spring.data.redis.client-type", havingValue = "jedis", matchIfMissing = true) class JedisConnectionConfiguration extends DataRedisConnectionConfiguration { - JedisConnectionConfiguration(DataRedisProperties properties, + JedisConnectionConfiguration(Environment environment, DataRedisProperties properties, ObjectProvider standaloneConfigurationProvider, ObjectProvider sentinelConfiguration, ObjectProvider clusterConfiguration, ObjectProvider masterReplicaConfiguration, DataRedisConnectionDetails connectionDetails) { - super(properties, connectionDetails, standaloneConfigurationProvider, sentinelConfiguration, + super(environment, properties, connectionDetails, standaloneConfigurationProvider, sentinelConfiguration, clusterConfiguration, masterReplicaConfiguration); } @@ -130,7 +132,7 @@ private JedisClientConfigurationBuilder applyProperties(JedisClientConfiguration PropertyMapper map = PropertyMapper.get(); map.from(getProperties().getTimeout()).to(builder::readTimeout); map.from(getProperties().getConnectTimeout()).to(builder::connectTimeout); - map.from(getProperties().getClientName()).whenHasText().to(builder::clientName); + map.from(determineClientName()).whenHasText().to(builder::clientName); return builder; } diff --git a/module/spring-boot-data-redis/src/main/java/org/springframework/boot/data/redis/autoconfigure/LettuceConnectionConfiguration.java b/module/spring-boot-data-redis/src/main/java/org/springframework/boot/data/redis/autoconfigure/LettuceConnectionConfiguration.java index adf02ebb0eb7..9a94c2a12355 100644 --- a/module/spring-boot-data-redis/src/main/java/org/springframework/boot/data/redis/autoconfigure/LettuceConnectionConfiguration.java +++ b/module/spring-boot-data-redis/src/main/java/org/springframework/boot/data/redis/autoconfigure/LettuceConnectionConfiguration.java @@ -44,6 +44,7 @@ import org.springframework.boot.thread.Threading; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisConnectionFactory; @@ -65,20 +66,21 @@ * @author Moritz Halbritter * @author Phillip Webb * @author Scott Frederick + * @author Yanming Zhou */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass(RedisClient.class) @ConditionalOnProperty(name = "spring.data.redis.client-type", havingValue = "lettuce", matchIfMissing = true) class LettuceConnectionConfiguration extends DataRedisConnectionConfiguration { - LettuceConnectionConfiguration(DataRedisProperties properties, + LettuceConnectionConfiguration(Environment environment, DataRedisProperties properties, ObjectProvider standaloneConfigurationProvider, ObjectProvider sentinelConfigurationProvider, ObjectProvider clusterConfigurationProvider, ObjectProvider masterReplicaConfiguration, DataRedisConnectionDetails connectionDetails) { - super(properties, connectionDetails, standaloneConfigurationProvider, sentinelConfigurationProvider, - clusterConfigurationProvider, masterReplicaConfiguration); + super(environment, properties, connectionDetails, standaloneConfigurationProvider, + sentinelConfigurationProvider, clusterConfigurationProvider, masterReplicaConfiguration); } @Bean(destroyMethod = "shutdown") @@ -183,8 +185,9 @@ private void applyProperties(LettuceClientConfigurationBuilder builder, @Nullabl builder.readFrom(getReadFrom(readFrom)); } } - if (StringUtils.hasText(getProperties().getClientName())) { - builder.clientName(getProperties().getClientName()); + String clientName = determineClientName(); + if (StringUtils.hasText(clientName)) { + builder.clientName(clientName); } } diff --git a/module/spring-boot-data-redis/src/test/java/org/springframework/boot/data/redis/autoconfigure/DataRedisAutoConfigurationJedisTests.java b/module/spring-boot-data-redis/src/test/java/org/springframework/boot/data/redis/autoconfigure/DataRedisAutoConfigurationJedisTests.java index bd6f9597e298..bda2ef977b87 100644 --- a/module/spring-boot-data-redis/src/test/java/org/springframework/boot/data/redis/autoconfigure/DataRedisAutoConfigurationJedisTests.java +++ b/module/spring-boot-data-redis/src/test/java/org/springframework/boot/data/redis/autoconfigure/DataRedisAutoConfigurationJedisTests.java @@ -50,6 +50,7 @@ * @author Andy Wilkinson * @author Phillip Webb * @author Scott Frederick + * @author Yanming Zhou */ @ClassPathExclusions("lettuce-core-*.jar") class DataRedisAutoConfigurationJedisTests { @@ -207,13 +208,19 @@ void testRedisConfigurationWithDefaultTimeouts() { } @Test - void testRedisConfigurationWithClientName() { - this.contextRunner.withPropertyValues("spring.data.redis.host:foo", "spring.data.redis.client-name:spring-boot") - .run((context) -> { - JedisConnectionFactory cf = context.getBean(JedisConnectionFactory.class); - assertThat(cf.getHostName()).isEqualTo("foo"); - assertThat(cf.getClientName()).isEqualTo("spring-boot"); - }); + void testRedisConfigurationWithImplicitClientName() { + this.contextRunner.withPropertyValues("spring.application.name:spring-boot").run((context) -> { + JedisConnectionFactory cf = context.getBean(JedisConnectionFactory.class); + assertThat(cf.getClientName()).isEqualTo("spring-boot"); + }); + } + + @Test + void testRedisConfigurationWithExplicitClientName() { + this.contextRunner.withPropertyValues("spring.data.redis.client-name:spring-boot").run((context) -> { + JedisConnectionFactory cf = context.getBean(JedisConnectionFactory.class); + assertThat(cf.getClientName()).isEqualTo("spring-boot"); + }); } @Test diff --git a/module/spring-boot-data-redis/src/test/java/org/springframework/boot/data/redis/autoconfigure/DataRedisAutoConfigurationTests.java b/module/spring-boot-data-redis/src/test/java/org/springframework/boot/data/redis/autoconfigure/DataRedisAutoConfigurationTests.java index a6aac6f418af..8803696dd4e2 100644 --- a/module/spring-boot-data-redis/src/test/java/org/springframework/boot/data/redis/autoconfigure/DataRedisAutoConfigurationTests.java +++ b/module/spring-boot-data-redis/src/test/java/org/springframework/boot/data/redis/autoconfigure/DataRedisAutoConfigurationTests.java @@ -94,6 +94,7 @@ * @author Moritz Halbritter * @author Andy Wilkinson * @author Phillip Webb + * @author Yanming Zhou */ class DataRedisAutoConfigurationTests { @@ -341,13 +342,19 @@ void testRedisConfigurationWithCustomBean() { } @Test - void testRedisConfigurationWithClientName() { - this.contextRunner.withPropertyValues("spring.data.redis.host:foo", "spring.data.redis.client-name:spring-boot") - .run((context) -> { - LettuceConnectionFactory cf = context.getBean(LettuceConnectionFactory.class); - assertThat(cf.getHostName()).isEqualTo("foo"); - assertThat(cf.getClientName()).isEqualTo("spring-boot"); - }); + void testRedisConfigurationWithImplicitClientName() { + this.contextRunner.withPropertyValues("spring.application.name:spring-boot").run((context) -> { + LettuceConnectionFactory cf = context.getBean(LettuceConnectionFactory.class); + assertThat(cf.getClientName()).isEqualTo("spring-boot"); + }); + } + + @Test + void testRedisConfigurationWithExplicitClientName() { + this.contextRunner.withPropertyValues("spring.data.redis.client-name:spring-boot").run((context) -> { + LettuceConnectionFactory cf = context.getBean(LettuceConnectionFactory.class); + assertThat(cf.getClientName()).isEqualTo("spring-boot"); + }); } @Test