From f904b52a1db42660ab77b4c76c6d6c527782833e Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Thu, 24 Sep 2015 17:07:22 +0100 Subject: [PATCH] Tweak eureka lifecycle so it re-registers after a refresh This version of Eureka is a bit of a singleton pig, so it's hard to control the lifecycle, but this seems to work for all the tests and also the eureka-first and ribbon-eureka samples. Fixes gh-551 for 1.0.x --- ...yClientConfigServiceAutoConfiguration.java | 30 ++++++++----------- ...ntConfigServiceBootstrapConfiguration.java | 10 +++++-- .../eureka/EurekaClientAutoConfiguration.java | 5 ++-- ...ntConfigServiceAutoConfigurationTests.java | 1 + 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/config/DiscoveryClientConfigServiceAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/config/DiscoveryClientConfigServiceAutoConfiguration.java index 362982bdd..187b0a794 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/config/DiscoveryClientConfigServiceAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/config/DiscoveryClientConfigServiceAutoConfiguration.java @@ -21,8 +21,9 @@ import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor; +import org.springframework.cloud.context.scope.refresh.RefreshScopeRefreshedEvent; import org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration; +import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Configuration; import com.netflix.appinfo.ApplicationInfoManager; @@ -31,15 +32,15 @@ import com.netflix.discovery.DiscoveryManager; import com.netflix.discovery.EurekaClientConfig; /** - * Bootstrap configuration for a config client that wants to lookup the config server via - * discovery. + * Bootstrap configuration for a config client that wants to lookup the config + * server via discovery. * * @author Dave Syer */ @ConditionalOnBean({ EurekaDiscoveryClientConfiguration.class }) @ConditionalOnProperty(value = "spring.cloud.config.discovery.enabled", matchIfMissing = false) @Configuration -public class DiscoveryClientConfigServiceAutoConfiguration { +public class DiscoveryClientConfigServiceAutoConfiguration implements ApplicationListener { @Autowired private EurekaClientConfig clientConfig; @@ -47,28 +48,23 @@ public class DiscoveryClientConfigServiceAutoConfiguration { @Autowired private EurekaInstanceConfig instanceConfig; - @Autowired - private ConfigurationPropertiesBindingPostProcessor binder; - @Autowired private EurekaDiscoveryClientConfiguration lifecycle; @PostConstruct public void init() { this.lifecycle.stop(); - rebind(this.clientConfig, "eurekaClientConfig"); - rebind(this.instanceConfig, "eurekaInstanceConfig"); - if (DiscoveryManager.getInstance().getDiscoveryClient() != null) { - DiscoveryManager.getInstance().getDiscoveryClient().shutdown(); - } + if (DiscoveryManager.getInstance().getDiscoveryClient() != null) { + DiscoveryManager.getInstance().getDiscoveryClient().shutdown(); + } ApplicationInfoManager.getInstance().initComponent(this.instanceConfig); - DiscoveryManager.getInstance().initComponent(this.instanceConfig, - this.clientConfig); + DiscoveryManager.getInstance().initComponent(this.instanceConfig, this.clientConfig); this.lifecycle.start(); } - - private void rebind(Object bean, String name) { - this.binder.postProcessBeforeInitialization(bean, name); + + @Override + public void onApplicationEvent(RefreshScopeRefreshedEvent arg0) { + init(); } } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/config/DiscoveryClientConfigServiceBootstrapConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/config/DiscoveryClientConfigServiceBootstrapConfiguration.java index 5f8a8b534..2dd9a2269 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/config/DiscoveryClientConfigServiceBootstrapConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/config/DiscoveryClientConfigServiceBootstrapConfiguration.java @@ -16,8 +16,6 @@ package org.springframework.cloud.netflix.config; -import lombok.extern.apachecommons.CommonsLog; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -27,6 +25,7 @@ import org.springframework.cloud.client.discovery.event.HeartbeatMonitor; import org.springframework.cloud.config.client.ConfigClientProperties; import org.springframework.cloud.config.client.ConfigServicePropertySourceLocator; import org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration; +import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationEvent; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -37,6 +36,8 @@ import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.DiscoveryClient; import com.netflix.discovery.DiscoveryManager; +import lombok.extern.apachecommons.CommonsLog; + /** * Bootstrap configuration for a config client that wants to lookup the config server via * discovery. @@ -57,9 +58,12 @@ public class DiscoveryClientConfigServiceBootstrapConfiguration implements @Autowired private ConfigClientProperties config; + @Autowired + private ApplicationContext context; + @Override public void onApplicationEvent(ApplicationEvent event) { - if (event instanceof ContextRefreshedEvent) { + if (event instanceof ContextRefreshedEvent && ((ContextRefreshedEvent) event).getApplicationContext()==context) { refresh(); } else if (event instanceof HeartbeatEvent) { diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java index 78eec7380..87bd4653e 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java @@ -27,6 +27,7 @@ import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.condition.SearchStrategy; import org.springframework.boot.builder.ParentContextApplicationContextInitializer; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.CommonsClientAutoConfiguration; @@ -71,13 +72,13 @@ public class EurekaClientAutoConfiguration implements ApplicationListener