diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/AbstractReactiveHealthIndicator.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/AbstractReactiveHealthIndicator.java index 5370f8964f..14ba42c9f4 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/AbstractReactiveHealthIndicator.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/AbstractReactiveHealthIndicator.java @@ -23,14 +23,24 @@ import reactor.core.publisher.Mono; * {@link Health} instance and error handling. * * @author Stephane Nicoll + * @author Nikolay Rybak * @since 2.0.0 */ public abstract class AbstractReactiveHealthIndicator implements ReactiveHealthIndicator { @Override public final Mono health() { - return doHealthCheck(new Health.Builder()) - .onErrorResume((ex) -> Mono.just(new Health.Builder().down(ex).build())); + try { + return doHealthCheck(new Health.Builder()) + .onErrorResume(this::handleFailure); + } + catch (Exception ex) { + return handleFailure(ex); + } + } + + private Mono handleFailure(Throwable ex) { + return Mono.just(new Health.Builder().down(ex).build()); } /** diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/redis/RedisReactiveHealthIndicatorTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/redis/RedisReactiveHealthIndicatorTests.java index 6d90134599..e93bcb5c2c 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/redis/RedisReactiveHealthIndicatorTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/redis/RedisReactiveHealthIndicatorTests.java @@ -18,6 +18,7 @@ package org.springframework.boot.actuate.redis; import java.util.Properties; +import io.lettuce.core.RedisConnectionException; import org.junit.Test; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; @@ -39,11 +40,12 @@ import static org.mockito.Mockito.verify; * * @author Stephane Nicoll * @author Mark Paluch + * @author Nikolay Rybak */ public class RedisReactiveHealthIndicatorTests { @Test - public void redisIsUp() throws Exception { + public void redisIsUp() { Properties info = new Properties(); info.put("redis_version", "2.8.9"); ReactiveRedisConnection redisConnection = mock(ReactiveRedisConnection.class); @@ -61,7 +63,7 @@ public class RedisReactiveHealthIndicatorTests { } @Test - public void redisIsDown() throws Exception { + public void redisCommandIsDown() { ReactiveServerCommands commands = mock(ReactiveServerCommands.class); given(commands.info()).willReturn( Mono.error(new RedisConnectionFailureException("Connection failed"))); @@ -75,6 +77,20 @@ public class RedisReactiveHealthIndicatorTests { verify(redisConnection).close(); } + @Test + public void redisConnectionIsDown() { + ReactiveRedisConnectionFactory redisConnectionFactory = mock( + ReactiveRedisConnectionFactory.class); + given(redisConnectionFactory.getReactiveConnection()).willThrow( + new RedisConnectionException("Unable to connect to localhost:6379")); + RedisReactiveHealthIndicator healthIndicator = new RedisReactiveHealthIndicator( + redisConnectionFactory); + Mono health = healthIndicator.health(); + StepVerifier.create(health) + .consumeNextWith((h) -> assertThat(h.getStatus()).isEqualTo(Status.DOWN)) + .verifyComplete(); + } + private RedisReactiveHealthIndicator createHealthIndicator( ReactiveRedisConnection redisConnection, ReactiveServerCommands serverCommands) {