Skip to content

Commit

Permalink
Enable Redis connection pool if commons-pool2 is available
Browse files Browse the repository at this point in the history
  • Loading branch information
weixsun authored and snicoll committed Jun 14, 2021
1 parent a72da74 commit 55ff163
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 22 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2012-2020 the original author or authors.
* Copyright 2012-2021 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -41,6 +41,7 @@
*
* @author Mark Paluch
* @author Stephane Nicoll
* @author Weix Sun
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ GenericObjectPool.class, JedisConnection.class, Jedis.class })
Expand Down Expand Up @@ -76,7 +77,7 @@ private JedisClientConfiguration getJedisClientConfiguration(
ObjectProvider<JedisClientConfigurationBuilderCustomizer> builderCustomizers) {
JedisClientConfigurationBuilder builder = applyProperties(JedisClientConfiguration.builder());
RedisProperties.Pool pool = getProperties().getJedis().getPool();
if (pool != null) {
if (pool.isEnabled()) {
applyPooling(pool, builder);
}
if (StringUtils.hasText(getProperties().getUrl())) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2012-2020 the original author or authors.
* Copyright 2012-2021 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -51,6 +51,7 @@
*
* @author Mark Paluch
* @author Andy Wilkinson
* @author Weix Sun
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisClient.class)
Expand Down Expand Up @@ -104,10 +105,10 @@ private LettuceClientConfiguration getLettuceClientConfiguration(
}

private LettuceClientConfigurationBuilder createBuilder(Pool pool) {
if (pool == null) {
return LettuceClientConfiguration.builder();
if (pool.isEnabled()) {
return new PoolBuilderFactory().createBuilder(pool);
}
return new PoolBuilderFactory().createBuilder(pool);
return LettuceClientConfiguration.builder();
}

private LettuceClientConfigurationBuilder applyProperties(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2012-2020 the original author or authors.
* Copyright 2012-2021 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -233,6 +233,8 @@ public enum ClientType {
*/
public static class Pool {

private boolean enabled;

/**
* Maximum number of "idle" connections in the pool. Use a negative value to
* indicate an unlimited number of idle connections.
Expand Down Expand Up @@ -265,6 +267,14 @@ public static class Pool {
*/
private Duration timeBetweenEvictionRuns;

public boolean isEnabled() {
return this.enabled;
}

public void setEnabled(boolean enabled) {
this.enabled = enabled;
}

public int getMaxIdle() {
return this.maxIdle;
}
Expand Down Expand Up @@ -396,14 +406,16 @@ public static class Jedis {
/**
* Jedis pool configuration.
*/
private Pool pool;
private final Pool pool;

public Pool getPool() {
return this.pool;
public Jedis() {
Pool pool = new Pool();
pool.setEnabled(true);
this.pool = pool;
}

public void setPool(Pool pool) {
this.pool = pool;
public Pool getPool() {
return this.pool;
}

}
Expand All @@ -421,7 +433,7 @@ public static class Lettuce {
/**
* Lettuce pool configuration.
*/
private Pool pool;
private final Pool pool = new Pool();

private final Cluster cluster = new Cluster();

Expand All @@ -437,10 +449,6 @@ public Pool getPool() {
return this.pool;
}

public void setPool(Pool pool) {
this.pool = pool;
}

public Cluster getCluster() {
return this.cluster;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
*
* @author Mark Paluch
* @author Stephane Nicoll
* @author Weix Sun
*/
@ClassPathExclusions("lettuce-core-*.jar")
class RedisAutoConfigurationJedisTests {
Expand Down Expand Up @@ -142,6 +143,16 @@ void testRedisConfigurationWithPool() {
});
}

@Test
void testRedisConfigurationDisabledPool() {
this.contextRunner.withPropertyValues("spring.redis.host:foo", "spring.redis.jedis.pool.enabled:false")
.run((context) -> {
JedisConnectionFactory cf = context.getBean(JedisConnectionFactory.class);
assertThat(cf.getHostName()).isEqualTo("foo");
assertThat(cf.getClientConfiguration().isUsePooling()).isEqualTo(false);
});
}

@Test
void testRedisConfigurationWithTimeoutAndConnectTimeout() {
this.contextRunner.withPropertyValues("spring.redis.host:foo", "spring.redis.timeout:250",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2012-2020 the original author or authors.
* Copyright 2012-2021 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -65,6 +65,7 @@
* @author Stephane Nicoll
* @author Alen Turkovic
* @author Scott Frederick
* @author Weix Sun
*/
class RedisAutoConfigurationTests {

Expand Down Expand Up @@ -155,10 +156,25 @@ void testPasswordInUrlStartsWithColon() {
}

@Test
void testRedisConfigurationWithPool() {
this.contextRunner.withPropertyValues("spring.redis.host:foo", "spring.redis.lettuce.pool.min-idle:1",
"spring.redis.lettuce.pool.max-idle:4", "spring.redis.lettuce.pool.max-active:16",
"spring.redis.lettuce.pool.max-wait:2000", "spring.redis.lettuce.pool.time-between-eviction-runs:30000",
void testRedisConfigurationWithPoolUsingDefaultValue() {
this.contextRunner.withPropertyValues("spring.redis.host:foo", "spring.redis.lettuce.pool.enabled:true")
.run((context) -> {
LettuceConnectionFactory cf = context.getBean(LettuceConnectionFactory.class);
assertThat(cf.getHostName()).isEqualTo("foo");
GenericObjectPoolConfig<?> poolConfig = getPoolingClientConfiguration(cf).getPoolConfig();
assertThat(poolConfig.getMinIdle()).isEqualTo(0);
assertThat(poolConfig.getMaxIdle()).isEqualTo(8);
assertThat(poolConfig.getMaxTotal()).isEqualTo(8);
assertThat(poolConfig.getMaxWaitMillis()).isEqualTo(-1);
});
}

@Test
void testRedisConfigurationWithPoolUsingCustomValue() {
this.contextRunner.withPropertyValues("spring.redis.host:foo", "spring.redis.lettuce.pool.enabled:true",
"spring.redis.lettuce.pool.min-idle:1", "spring.redis.lettuce.pool.max-idle:4",
"spring.redis.lettuce.pool.max-active:16", "spring.redis.lettuce.pool.max-wait:2000",
"spring.redis.lettuce.pool.time-between-eviction-runs:30000",
"spring.redis.lettuce.shutdown-timeout:1000").run((context) -> {
LettuceConnectionFactory cf = context.getBean(LettuceConnectionFactory.class);
assertThat(cf.getHostName()).isEqualTo("foo");
Expand All @@ -172,6 +188,17 @@ void testRedisConfigurationWithPool() {
});
}

@Test
void testRedisConfigurationDisabledPool() {
this.contextRunner.withPropertyValues("spring.redis.host:foo", "spring.redis.lettuce.pool.enabled:false")
.run((context) -> {
LettuceConnectionFactory cf = context.getBean(LettuceConnectionFactory.class);
assertThat(cf.getHostName()).isEqualTo("foo");
assertThat(ReflectionTestUtils.getField(cf, "clientConfiguration"))
.isNotInstanceOf(LettucePoolingClientConfiguration.class);
});
}

@Test
void testRedisConfigurationWithTimeoutAndConnectTimeout() {
this.contextRunner.withPropertyValues("spring.redis.host:foo", "spring.redis.timeout:250",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
spring.redis.lettuce.pool.enabled=false

0 comments on commit 55ff163

Please sign in to comment.