diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaServiceRegistry.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaServiceRegistry.java index 8d4536d5bc..21165cd024 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaServiceRegistry.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaServiceRegistry.java @@ -49,11 +49,17 @@ public EurekaServiceRegistry(EurekaInstanceConfigBean eurekaInstanceConfigBean) @Override public void register(EurekaRegistration reg) { + if (log.isInfoEnabled()) { + log.info("Registering application " + reg.getApplicationInfoManager().getInfo().getAppName() + + " with eureka with status " + reg.getInstanceConfig().getInitialStatus()); + } + + reg.getApplicationInfoManager().setInstanceStatus(reg.getInstanceConfig().getInitialStatus()); + if (eurekaInstanceConfigBean != null && eurekaInstanceConfigBean.isAsyncClientInitialization()) { if (log.isDebugEnabled()) { log.debug("Initializing client asynchronously..."); } - ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.submit(() -> { maybeInitializeClient(reg); @@ -65,14 +71,6 @@ public void register(EurekaRegistration reg) { else { maybeInitializeClient(reg); } - - if (log.isInfoEnabled()) { - log.info("Registering application " + reg.getApplicationInfoManager().getInfo().getAppName() - + " with eureka with status " + reg.getInstanceConfig().getInitialStatus()); - } - - reg.getApplicationInfoManager().setInstanceStatus(reg.getInstanceConfig().getInitialStatus()); - reg.getHealthCheckHandler() .ifAvailable(healthCheckHandler -> reg.getEurekaClient().registerHealthCheck(healthCheckHandler)); } diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaServiceRegistryTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaServiceRegistryTests.java index 170e6dbfe4..34c8dfff1d 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaServiceRegistryTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaServiceRegistryTests.java @@ -24,6 +24,7 @@ import com.netflix.appinfo.InstanceInfo; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -40,6 +41,7 @@ import static com.netflix.appinfo.InstanceInfo.InstanceStatus.UNKNOWN; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; +import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -156,6 +158,32 @@ void eurekaClientGetStatusNoInstance() { assertThat(map).hasSize(1).containsEntry("status", UNKNOWN.toString()); } + @Test + void initialStatusIsSetBeforeClientInitialization() { + EurekaServiceRegistry registry = new EurekaServiceRegistry(eurekaInstanceConfigBean); + + CloudEurekaClient eurekaClient = mock(CloudEurekaClient.class); + ApplicationInfoManager applicationInfoManager = mock(ApplicationInfoManager.class); + + when(applicationInfoManager.getInfo()).thenReturn(mock(InstanceInfo.class)); + + EurekaRegistration registration = EurekaRegistration + .builder(new EurekaInstanceConfigBean(new InetUtils(new InetUtilsProperties()))) + .with(eurekaClient) + .with(applicationInfoManager) + .with(new EurekaClientConfigBean(), mock(ApplicationEventPublisher.class)) + .with(new SimpleObjectProvider<>(null)) + .build(); + + registry.register(registration); + + InOrder inOrder = inOrder(applicationInfoManager, eurekaClient); + + inOrder.verify(applicationInfoManager).setInstanceStatus(registration.getInstanceConfig().getInitialStatus()); + + inOrder.verify(eurekaClient).getApplications(); + } + @Test void eurekaClientInitializesClientAsynchronously() { when(eurekaInstanceConfigBean.isAsyncClientInitialization()).thenReturn(true);