Skip to content

Commit 017eb8e

Browse files
committed
Merge pull request spring-projects#9510 from mp911de:redis-client-config
* pr/9510: Polish "Use Redis client configuration to configure connection factories" Use Redis client configuration to configure connection factories
2 parents eb764a7 + a4688bd commit 017eb8e

File tree

7 files changed

+292
-117
lines changed

7 files changed

+292
-117
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright 2012-2017 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.data.redis;
18+
19+
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
20+
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration.JedisClientConfigurationBuilder;
21+
22+
/**
23+
* Callback interface that can be implemented by beans wishing to customize the
24+
* {@link JedisClientConfiguration} via a {@link JedisClientConfigurationBuilder
25+
* JedisClientConfiguration.JedisClientConfigurationBuilder} whilst retaining default
26+
* auto-configuration.
27+
*
28+
* @author Mark Paluch
29+
* @since 2.0.0
30+
*/
31+
@FunctionalInterface
32+
public interface JedisClientConfigurationBuilderCustomizer {
33+
34+
/**
35+
* Customize the {@link JedisClientConfigurationBuilder}.
36+
* @param clientConfigurationBuilder the builder to customize
37+
*/
38+
void customize(JedisClientConfigurationBuilder clientConfigurationBuilder);
39+
40+
}

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java

Lines changed: 60 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
package org.springframework.boot.autoconfigure.data.redis;
1818

1919
import java.net.UnknownHostException;
20+
import java.time.Duration;
21+
import java.util.Collections;
22+
import java.util.List;
2023

2124
import org.apache.commons.pool2.impl.GenericObjectPool;
2225
import redis.clients.jedis.Jedis;
@@ -30,6 +33,8 @@
3033
import org.springframework.data.redis.connection.RedisClusterConfiguration;
3134
import org.springframework.data.redis.connection.RedisConnectionFactory;
3235
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
36+
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
37+
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration.JedisClientConfigurationBuilder;
3338
import org.springframework.data.redis.connection.jedis.JedisConnection;
3439
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
3540
import org.springframework.util.StringUtils;
@@ -46,66 +51,68 @@ class JedisConnectionConfiguration extends RedisConnectionConfiguration {
4651

4752
private final RedisProperties properties;
4853

54+
private final List<JedisClientConfigurationBuilderCustomizer> builderCustomizers;
55+
4956
JedisConnectionConfiguration(RedisProperties properties,
5057
ObjectProvider<RedisSentinelConfiguration> sentinelConfiguration,
51-
ObjectProvider<RedisClusterConfiguration> clusterConfiguration) {
58+
ObjectProvider<RedisClusterConfiguration> clusterConfiguration,
59+
ObjectProvider<List<JedisClientConfigurationBuilderCustomizer>> builderCustomizers) {
5260
super(properties, sentinelConfiguration, clusterConfiguration);
5361
this.properties = properties;
62+
this.builderCustomizers = builderCustomizers
63+
.getIfAvailable(Collections::emptyList);
5464
}
5565

5666
@Bean
5767
@ConditionalOnMissingBean(RedisConnectionFactory.class)
5868
public JedisConnectionFactory redisConnectionFactory() throws UnknownHostException {
59-
return applyProperties(createJedisConnectionFactory());
69+
return createJedisConnectionFactory();
6070
}
6171

62-
private JedisConnectionFactory applyProperties(JedisConnectionFactory factory) {
63-
configureConnection(factory);
64-
if (this.properties.isSsl()) {
65-
factory.setUseSsl(true);
72+
private JedisConnectionFactory createJedisConnectionFactory() {
73+
JedisClientConfiguration clientConfiguration = getJedisClientConfiguration();
74+
75+
if (getSentinelConfig() != null) {
76+
return new JedisConnectionFactory(getSentinelConfig(), clientConfiguration);
6677
}
67-
factory.setDatabase(this.properties.getDatabase());
68-
if (this.properties.getTimeout() > 0) {
69-
factory.setTimeout(this.properties.getTimeout());
78+
79+
if (getClusterConfiguration() != null) {
80+
return new JedisConnectionFactory(getClusterConfiguration(),
81+
clientConfiguration);
7082
}
71-
return factory;
83+
84+
return new JedisConnectionFactory(getStandaloneConfig(), clientConfiguration);
7285
}
7386

74-
private void configureConnection(JedisConnectionFactory factory) {
75-
if (StringUtils.hasText(this.properties.getUrl())) {
76-
configureConnectionFromUrl(factory);
87+
private JedisClientConfiguration getJedisClientConfiguration() {
88+
JedisClientConfigurationBuilder builder = applyProperties(
89+
JedisClientConfiguration.builder());
90+
RedisProperties.Pool pool = this.properties.getJedis().getPool();
91+
if (pool != null) {
92+
applyPooling(pool, builder);
7793
}
78-
else {
79-
factory.setHostName(this.properties.getHost());
80-
factory.setPort(this.properties.getPort());
81-
if (this.properties.getPassword() != null) {
82-
factory.setPassword(this.properties.getPassword());
83-
}
94+
if (StringUtils.hasText(this.properties.getUrl())) {
95+
customizeConfigurationFromUrl(builder);
8496
}
97+
customize(builder);
98+
return builder.build();
8599
}
86100

87-
private void configureConnectionFromUrl(JedisConnectionFactory factory) {
88-
ConnectionInfo connectionInfo = parseUrl(this.properties.getUrl());
89-
factory.setUseSsl(connectionInfo.isUseSsl());
90-
factory.setHostName(connectionInfo.getHostName());
91-
factory.setPort(connectionInfo.getPort());
92-
if (connectionInfo.getPassword() != null) {
93-
factory.setPassword(connectionInfo.getPassword());
101+
private JedisClientConfigurationBuilder applyProperties(
102+
JedisClientConfigurationBuilder builder) {
103+
if (this.properties.isSsl()) {
104+
builder.useSsl();
105+
}
106+
if (this.properties.getTimeout() != 0) {
107+
Duration timeout = Duration.ofMillis(this.properties.getTimeout());
108+
builder.readTimeout(timeout).connectTimeout(timeout);
94109
}
110+
return builder;
95111
}
96112

97-
private JedisConnectionFactory createJedisConnectionFactory() {
98-
RedisProperties.Pool pool = this.properties.getJedis().getPool();
99-
JedisPoolConfig poolConfig = pool != null ? jedisPoolConfig(pool)
100-
: new JedisPoolConfig();
101-
102-
if (getSentinelConfig() != null) {
103-
return new JedisConnectionFactory(getSentinelConfig(), poolConfig);
104-
}
105-
if (getClusterConfiguration() != null) {
106-
return new JedisConnectionFactory(getClusterConfiguration(), poolConfig);
107-
}
108-
return new JedisConnectionFactory(poolConfig);
113+
private void applyPooling(RedisProperties.Pool pool,
114+
JedisClientConfiguration.JedisClientConfigurationBuilder builder) {
115+
builder.usePooling().poolConfig(jedisPoolConfig(pool));
109116
}
110117

111118
private JedisPoolConfig jedisPoolConfig(RedisProperties.Pool pool) {
@@ -117,4 +124,19 @@ private JedisPoolConfig jedisPoolConfig(RedisProperties.Pool pool) {
117124
return config;
118125
}
119126

127+
private void customizeConfigurationFromUrl(
128+
JedisClientConfiguration.JedisClientConfigurationBuilder builder) {
129+
ConnectionInfo connectionInfo = parseUrl(this.properties.getUrl());
130+
if (connectionInfo.isUseSsl()) {
131+
builder.useSsl();
132+
}
133+
}
134+
135+
private void customize(
136+
JedisClientConfiguration.JedisClientConfigurationBuilder builder) {
137+
for (JedisClientConfigurationBuilderCustomizer customizer : this.builderCustomizers) {
138+
customizer.customize(builder);
139+
}
140+
}
141+
120142
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright 2012-2017 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.data.redis;
18+
19+
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
20+
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration.LettuceClientConfigurationBuilder;
21+
22+
/**
23+
* Callback interface that can be implemented by beans wishing to customize the
24+
* {@link LettuceClientConfiguration} via a {@link LettuceClientConfigurationBuilder
25+
* LettuceClientConfiguration.LettuceClientConfigurationBuilder} whilst retaining default
26+
* auto-configuration.
27+
*
28+
* @author Mark Paluch
29+
* @since 2.0.0
30+
*/
31+
@FunctionalInterface
32+
public interface LettuceClientConfigurationBuilderCustomizer {
33+
34+
/**
35+
* Customize the {@link LettuceClientConfigurationBuilder}.
36+
* @param clientConfigurationBuilder the builder to customize
37+
*/
38+
void customize(LettuceClientConfigurationBuilder clientConfigurationBuilder);
39+
40+
}

0 commit comments

Comments
 (0)