diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/health/DiscoveryClientHealthIndicator.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/health/DiscoveryClientHealthIndicator.java index dec5ad94..1c0ceec2 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/health/DiscoveryClientHealthIndicator.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/health/DiscoveryClientHealthIndicator.java @@ -17,19 +17,25 @@ package org.springframework.cloud.client.discovery.health; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import lombok.extern.apachecommons.CommonsLog; import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.Status; import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.discovery.event.InstanceRegisteredEvent; +import org.springframework.context.ApplicationListener; import org.springframework.core.Ordered; /** * @author Spencer Gibb */ @CommonsLog -public class DiscoveryClientHealthIndicator implements DiscoveryHealthIndicator, Ordered { +public class DiscoveryClientHealthIndicator implements DiscoveryHealthIndicator, Ordered, + ApplicationListener { + + private AtomicBoolean discoveryInitialized = new AtomicBoolean(false); private int order = Ordered.HIGHEST_PRECEDENCE; @@ -39,17 +45,31 @@ public class DiscoveryClientHealthIndicator implements DiscoveryHealthIndicator, this.discoveryClient = discoveryClient; } + @Override + public void onApplicationEvent(InstanceRegisteredEvent event) { + if (this.discoveryInitialized.compareAndSet(false, true)) { + log.debug("Discovery Client has been initialized"); + } + } + @Override public Health health() { Health.Builder builder = new Health.Builder(); - try { - List services = this.discoveryClient.getServices(); - builder.status(new Status("UP", this.discoveryClient.description())) - .withDetail("services", services); + + if (this.discoveryInitialized.get()) { + try { + List services = this.discoveryClient.getServices(); + builder.status(new Status("UP", this.discoveryClient.description())) + .withDetail("services", services); + } + catch (Exception e) { + log.error("Error", e); + builder.down(e); + } } - catch (Exception e) { - log.error("Error", e); - builder.down(e); + else { + builder.status(new Status(Status.UNKNOWN.getCode(), + "Discovery Client not initialized")); } return builder.build(); } diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/health/DiscoveryCompositeHealthIndicatorTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/health/DiscoveryCompositeHealthIndicatorTests.java index 552e7967..d7f493cc 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/health/DiscoveryCompositeHealthIndicatorTests.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/health/DiscoveryCompositeHealthIndicatorTests.java @@ -32,6 +32,7 @@ import org.springframework.boot.actuate.health.OrderedHealthAggregator; import org.springframework.boot.actuate.health.Status; import org.springframework.cloud.client.CommonsClientAutoConfiguration; import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.discovery.event.InstanceRegisteredEvent; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; @@ -48,6 +49,9 @@ public class DiscoveryCompositeHealthIndicatorTests { @Autowired DiscoveryCompositeHealthIndicator healthIndicator; + @Autowired + DiscoveryClientHealthIndicator clientHealthIndicator; + @Configuration public static class Config { @Bean @@ -83,12 +87,22 @@ public class DiscoveryCompositeHealthIndicatorTests { public void testHealthIndicator() { assertNotNull("healthIndicator was null", this.healthIndicator); Health health = this.healthIndicator.health(); - assertNotNull("health was null", health); - Status status = health.getStatus(); - assertNotNull("status was null", status); - assertEquals("status code was wrong", "UP", status.getCode()); + assertHealth(health, Status.UNKNOWN); + + clientHealthIndicator.onApplicationEvent(new InstanceRegisteredEvent(this, null)); + + health = this.healthIndicator.health(); + Status status = assertHealth(health, Status.UP); assertEquals("status desciption was wrong", "TestDiscoveryClient", status.getDescription()); } + protected Status assertHealth(Health health, Status expected) { + assertNotNull("health was null", health); + Status status = health.getStatus(); + assertNotNull("status was null", status); + assertEquals("status code was wrong", expected.getCode(), status.getCode()); + return status; + } + }