From 1659d4602880ac4fdff6491a72adbebae7465e12 Mon Sep 17 00:00:00 2001 From: Gemini Kim Date: Thu, 2 May 2019 09:02:05 +0900 Subject: [PATCH 1/2] Enable minIdle by allowing timeBetweenEviction runs to be configured See gh-16703 --- .../redis/JedisConnectionConfiguration.java | 4 ++++ .../redis/LettuceConnectionConfiguration.java | 4 ++++ .../data/redis/RedisProperties.java | 19 +++++++++++++++++++ .../RedisAutoConfigurationJedisTests.java | 15 ++++++++++----- .../redis/RedisAutoConfigurationTests.java | 3 +++ 5 files changed, 40 insertions(+), 5 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java index fb5eaed15d..3b1c87081f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java @@ -114,6 +114,10 @@ class JedisConnectionConfiguration extends RedisConnectionConfiguration { config.setMaxTotal(pool.getMaxActive()); config.setMaxIdle(pool.getMaxIdle()); config.setMinIdle(pool.getMinIdle()); + if (pool.getTimeBetweenEvictionRuns() != null) { + config.setTimeBetweenEvictionRunsMillis( + pool.getTimeBetweenEvictionRuns().toMillis()); + } if (pool.getMaxWait() != null) { config.setMaxWaitMillis(pool.getMaxWait().toMillis()); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java index d69a51ef9a..6d890c139a 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java @@ -155,6 +155,10 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration { config.setMaxTotal(properties.getMaxActive()); config.setMaxIdle(properties.getMaxIdle()); config.setMinIdle(properties.getMinIdle()); + if (properties.getTimeBetweenEvictionRuns() != null) { + config.setTimeBetweenEvictionRunsMillis( + properties.getTimeBetweenEvictionRuns().toMillis()); + } if (properties.getMaxWait() != null) { config.setMaxWaitMillis(properties.getMaxWait().toMillis()); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java index 8258ddd335..4dbf061282 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java @@ -172,6 +172,9 @@ public class RedisProperties { /** * Target for the minimum number of idle connections to maintain in the pool. This * setting only has an effect if it is positive. + * + * This setting only has an effect if it is positive and `timeBetweenEvictionRuns` + * is greater than zero. */ private int minIdle = 0; @@ -188,6 +191,14 @@ public class RedisProperties { */ private Duration maxWait = Duration.ofMillis(-1); + /** + * Time to sleep between runs of the idle object evictor thread. + * + * When positive, the idle object evictor thread starts. When non-positive, no + * idle object evictor thread runs. + */ + private Duration timeBetweenEvictionRuns; + public int getMaxIdle() { return this.maxIdle; } @@ -220,6 +231,14 @@ public class RedisProperties { this.maxWait = maxWait; } + public Duration getTimeBetweenEvictionRuns() { + return this.timeBetweenEvictionRuns; + } + + public void setTimeBetweenEvictionRuns(Duration timeBetweenEvictionRuns) { + this.timeBetweenEvictionRuns = timeBetweenEvictionRuns; + } + } /** diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationJedisTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationJedisTests.java index 158d873acd..714f063f5f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationJedisTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationJedisTests.java @@ -134,11 +134,14 @@ public class RedisAutoConfigurationJedisTests { @Test public void testRedisConfigurationWithPool() { - this.contextRunner.withPropertyValues("spring.redis.host:foo", - "spring.redis.jedis.pool.min-idle:1", - "spring.redis.jedis.pool.max-idle:4", - "spring.redis.jedis.pool.max-active:16", - "spring.redis.jedis.pool.max-wait:2000").run((context) -> { + this.contextRunner + .withPropertyValues("spring.redis.host:foo", + "spring.redis.jedis.pool.min-idle:1", + "spring.redis.jedis.pool.max-idle:4", + "spring.redis.jedis.pool.max-active:16", + "spring.redis.jedis.pool.max-wait:2000", + "spring.redis.jedis.pool.time-between-eviction-runs:30000") + .run((context) -> { JedisConnectionFactory cf = context .getBean(JedisConnectionFactory.class); assertThat(cf.getHostName()).isEqualTo("foo"); @@ -146,6 +149,8 @@ public class RedisAutoConfigurationJedisTests { assertThat(cf.getPoolConfig().getMaxIdle()).isEqualTo(4); assertThat(cf.getPoolConfig().getMaxTotal()).isEqualTo(16); assertThat(cf.getPoolConfig().getMaxWaitMillis()).isEqualTo(2000); + assertThat(cf.getPoolConfig().getTimeBetweenEvictionRunsMillis()) + .isEqualTo(30000); }); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java index af66c8ff7f..2a584a5ac1 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java @@ -155,6 +155,7 @@ public class RedisAutoConfigurationTests { "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); @@ -165,6 +166,8 @@ public class RedisAutoConfigurationTests { assertThat(poolConfig.getMaxIdle()).isEqualTo(4); assertThat(poolConfig.getMaxTotal()).isEqualTo(16); assertThat(poolConfig.getMaxWaitMillis()).isEqualTo(2000); + assertThat(poolConfig.getTimeBetweenEvictionRunsMillis()) + .isEqualTo(30000); assertThat(cf.getShutdownTimeout()).isEqualTo(1000); }); } From 96f3a482f0520d7d4c78deb6175a325a6fa0ef79 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 9 May 2019 15:28:36 +0100 Subject: [PATCH 2/2] Polish "Enable minIdle by allowing timeBetweenEviction runs to be configured" See gh-16703 --- .../data/redis/JedisConnectionConfiguration.java | 2 +- .../data/redis/LettuceConnectionConfiguration.java | 2 +- .../autoconfigure/data/redis/RedisProperties.java | 14 +++++--------- .../redis/RedisAutoConfigurationJedisTests.java | 2 +- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java index 3b1c87081f..78cdcb22f6 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 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. diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java index 6d890c139a..46e6b1f8ac 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 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. diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java index 4dbf061282..a1976b12a7 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2019 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. @@ -171,10 +171,8 @@ public class RedisProperties { /** * Target for the minimum number of idle connections to maintain in the pool. This - * setting only has an effect if it is positive. - * - * This setting only has an effect if it is positive and `timeBetweenEvictionRuns` - * is greater than zero. + * setting only has an effect if both it and time between eviction runs are + * positive. */ private int minIdle = 0; @@ -192,10 +190,8 @@ public class RedisProperties { private Duration maxWait = Duration.ofMillis(-1); /** - * Time to sleep between runs of the idle object evictor thread. - * - * When positive, the idle object evictor thread starts. When non-positive, no - * idle object evictor thread runs. + * Time between runs of the idle object evictor thread. When positive, the idle + * object evictor thread starts, otherwise no idle object eviction is performed. */ private Duration timeBetweenEvictionRuns; diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationJedisTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationJedisTests.java index 714f063f5f..7798195a01 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationJedisTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationJedisTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 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.