diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/RedisReactiveHealthIndicator.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/RedisReactiveHealthIndicator.java index 6b44f96ec78..585d0cb0a29 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/RedisReactiveHealthIndicator.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/RedisReactiveHealthIndicator.java @@ -18,12 +18,14 @@ package org.springframework.boot.actuate.health; import reactor.core.publisher.Mono; +import org.springframework.data.redis.connection.ReactiveRedisConnection; import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; /** * A {@link ReactiveHealthIndicator} for Redis. * * @author Stephane Nicoll + * @author Mark Paluch * @since 2.0.0 */ public class RedisReactiveHealthIndicator extends AbstractReactiveHealthIndicator { @@ -37,10 +39,14 @@ public class RedisReactiveHealthIndicator extends AbstractReactiveHealthIndicato @Override protected Mono doHealthCheck(Health.Builder builder) { - return this.connectionFactory.getReactiveConnection().serverCommands().info() - .map(info -> builder.up().withDetail( - RedisHealthIndicator.VERSION, info.getProperty( - RedisHealthIndicator.REDIS_VERSION)).build()); + ReactiveRedisConnection connection = this.connectionFactory + .getReactiveConnection(); + return connection.serverCommands().info() + .map(info -> builder.up() + .withDetail(RedisHealthIndicator.VERSION, + info.getProperty(RedisHealthIndicator.REDIS_VERSION)) + .build()) + .doFinally(signal -> connection.close()); } } diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/RedisReactiveHealthIndicatorTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/RedisReactiveHealthIndicatorTests.java index 79f0f970a79..681d9159d8e 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/RedisReactiveHealthIndicatorTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/RedisReactiveHealthIndicatorTests.java @@ -30,11 +30,13 @@ import org.springframework.data.redis.connection.ReactiveServerCommands; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; /** * Tests for {@link RedisReactiveHealthIndicator}. * * @author Stephane Nicoll + * @author Mark Paluch */ public class RedisReactiveHealthIndicatorTests { @@ -42,15 +44,17 @@ public class RedisReactiveHealthIndicatorTests { public void redisIsUp() throws Exception { Properties info = new Properties(); info.put("redis_version", "2.8.9"); + ReactiveRedisConnection redisConnection = mock(ReactiveRedisConnection.class); ReactiveServerCommands commands = mock(ReactiveServerCommands.class); given(commands.info()).willReturn(Mono.just(info)); - RedisReactiveHealthIndicator healthIndicator = createHealthIndicator(commands); + RedisReactiveHealthIndicator healthIndicator = createHealthIndicator(redisConnection, commands); Mono health = healthIndicator.health(); StepVerifier.create(health).consumeNextWith(h -> { assertThat(h.getStatus()).isEqualTo(Status.UP); assertThat(h.getDetails()).containsOnlyKeys("version"); assertThat(h.getDetails().get("version")).isEqualTo("2.8.9"); }).verifyComplete(); + verify(redisConnection).close(); } @Test @@ -58,15 +62,18 @@ public class RedisReactiveHealthIndicatorTests { ReactiveServerCommands commands = mock(ReactiveServerCommands.class); given(commands.info()).willReturn(Mono.error( new RedisConnectionFailureException("Connection failed"))); - RedisReactiveHealthIndicator healthIndicator = createHealthIndicator(commands); + ReactiveRedisConnection redisConnection = mock(ReactiveRedisConnection.class); + RedisReactiveHealthIndicator healthIndicator = createHealthIndicator(redisConnection, commands); Mono health = healthIndicator.health(); - StepVerifier.create(health) - .expectError(RedisConnectionFailureException.class); + StepVerifier.create(health).consumeNextWith(h -> { + assertThat(h.getStatus()).isEqualTo(Status.DOWN); + }).verifyComplete(); + verify(redisConnection).close(); } private RedisReactiveHealthIndicator createHealthIndicator( - ReactiveServerCommands serverCommands) { - ReactiveRedisConnection redisConnection = mock(ReactiveRedisConnection.class); + ReactiveRedisConnection redisConnection, ReactiveServerCommands serverCommands) { + ReactiveRedisConnectionFactory redisConnectionFactory = mock( ReactiveRedisConnectionFactory.class); given(redisConnectionFactory.getReactiveConnection()).willReturn(redisConnection);