From 9bc8a5039d06a059862ce5ebae9a9149526ec3a2 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Tue, 25 Nov 2014 17:19:02 -0700 Subject: [PATCH] Fire InstanceRegisterEvent after eureka registration, then components can listen for that event and safely access DiscoveryClient. --- .../discovery/InstanceRegisteredEvent.java | 24 +++++++++++++++++++ .../eureka/EurekaClientConfiguration.java | 6 +++++ .../netflix/zuul/ZuulHandlerMapping.java | 6 ++--- .../sample/ZuulProxyApplicationTests.java | 4 +--- .../sidecar/SidecarApplicationTests.java | 6 +---- 5 files changed, 35 insertions(+), 11 deletions(-) create mode 100644 spring-cloud-netflix-core/src/main/java/org/springframework/cloud/client/discovery/InstanceRegisteredEvent.java diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/client/discovery/InstanceRegisteredEvent.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/client/discovery/InstanceRegisteredEvent.java new file mode 100644 index 00000000..e9dd46eb --- /dev/null +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/client/discovery/InstanceRegisteredEvent.java @@ -0,0 +1,24 @@ +package org.springframework.cloud.client.discovery; + +import org.springframework.context.ApplicationEvent; + +/** + * @author Spencer Gibb + */ +public class InstanceRegisteredEvent extends ApplicationEvent { + private Object config; + + /** + * Create a new ApplicationEvent. + * + * @param source the component that published the event (never {@code null}) + */ + public InstanceRegisteredEvent(Object source, Object config) { + super(source); + this.config = config; + } + + public Object getConfig() { + return config; + } +} diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java index d6a90859..41a0604b 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java @@ -27,6 +27,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.discovery.InstanceRegisteredEvent; +import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationListener; import org.springframework.context.SmartLifecycle; import org.springframework.context.annotation.Bean; @@ -66,6 +68,9 @@ public class EurekaClientConfiguration implements SmartLifecycle, Ordered { @Autowired(required = false) private HealthCheckHandler healthCheckHandler; + @Autowired + private ApplicationContext context; + @PreDestroy public void close() { logger.info("Removing application {} from eureka", instanceConfig.getAppname()); @@ -90,6 +95,7 @@ public class EurekaClientConfiguration implements SmartLifecycle, Ordered { if (healthCheckHandler != null) { DiscoveryManager.getInstance().getDiscoveryClient().registerHealthCheck(healthCheckHandler); } + context.publishEvent(new InstanceRegisteredEvent(this, instanceConfig)); running = true; } } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulHandlerMapping.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulHandlerMapping.java index d9fa994f..51c16f61 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulHandlerMapping.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulHandlerMapping.java @@ -2,8 +2,8 @@ package org.springframework.cloud.netflix.zuul; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.client.discovery.InstanceRegisteredEvent; import org.springframework.context.ApplicationListener; -import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.util.StringUtils; import org.springframework.web.servlet.handler.AbstractUrlHandlerMapping; @@ -14,7 +14,7 @@ import java.util.Map; * @author Spencer Gibb */ @Slf4j -public class ZuulHandlerMapping extends AbstractUrlHandlerMapping implements ApplicationListener { +public class ZuulHandlerMapping extends AbstractUrlHandlerMapping implements ApplicationListener { @Autowired protected RouteLocator routeLocator; @@ -34,7 +34,7 @@ public class ZuulHandlerMapping extends AbstractUrlHandlerMapping implements App } @Override - public void onApplicationEvent(ContextRefreshedEvent event) { + public void onApplicationEvent(InstanceRegisteredEvent event) { registerHandlers(routeLocator.getRoutes()); } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/sample/ZuulProxyApplicationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/sample/ZuulProxyApplicationTests.java index 7f4da916..a692efb1 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/sample/ZuulProxyApplicationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/sample/ZuulProxyApplicationTests.java @@ -1,6 +1,5 @@ package org.springframework.cloud.netflix.zuul.sample; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.IntegrationTest; @@ -14,8 +13,7 @@ import org.springframework.test.context.web.WebAppConfiguration; @IntegrationTest("server.port=0") public class ZuulProxyApplicationTests { - @Ignore - @Test + @Test public void contextLoads() { } diff --git a/spring-cloud-netflix-sidecar/src/test/java/org/springframework/cloud/netflix/sidecar/SidecarApplicationTests.java b/spring-cloud-netflix-sidecar/src/test/java/org/springframework/cloud/netflix/sidecar/SidecarApplicationTests.java index 9778e02f..f5766ce0 100644 --- a/spring-cloud-netflix-sidecar/src/test/java/org/springframework/cloud/netflix/sidecar/SidecarApplicationTests.java +++ b/spring-cloud-netflix-sidecar/src/test/java/org/springframework/cloud/netflix/sidecar/SidecarApplicationTests.java @@ -1,21 +1,17 @@ package org.springframework.cloud.netflix.sidecar; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.IntegrationTest; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = SidecarApplication.class) -@WebAppConfiguration @IntegrationTest("server.port=0") -@Ignore public class SidecarApplicationTests { - @Test() + @Test public void contextLoads() { }