Fix race condition in server

This commit is contained in:
Dave Syer
2014-07-27 19:38:51 -07:00
parent 98d0da973e
commit 88f79507e3
3 changed files with 74 additions and 9 deletions

View File

@@ -15,7 +15,6 @@
*/
package org.springframework.platform.netflix.eureka;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.slf4j.Logger;
@@ -25,8 +24,10 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationListener;
import org.springframework.context.SmartLifecycle;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.Ordered;
import com.netflix.appinfo.ApplicationInfoManager;
import com.netflix.appinfo.InstanceInfo.InstanceStatus;
@@ -43,10 +44,14 @@ import com.netflix.discovery.EurekaClientConfig;
@ConditionalOnClass(EurekaClientConfig.class)
@ConditionalOnExpression("${eureka.client.enabled:true}")
public class EurekaClientAutoConfiguration implements
ApplicationListener<ContextRefreshedEvent> {
ApplicationListener<ContextRefreshedEvent>, SmartLifecycle, Ordered {
private static final Logger logger = LoggerFactory.getLogger(EurekaClientAutoConfiguration.class);
private boolean running;
private int order = 0;
@Autowired
private EurekaClientConfigBean clientConfig;
@@ -55,19 +60,49 @@ public class EurekaClientAutoConfiguration implements
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
logger.info("Registering application {} with eureka with status UP", instanceConfig.getAppname());
logger.info("Registering application {} with eureka with status UP", instanceConfig.getAppname());
ApplicationInfoManager.getInstance().setInstanceStatus(InstanceStatus.UP);
}
@PostConstruct
public void init() {
DiscoveryManager.getInstance().initComponent(instanceConfig, clientConfig);
}
@PreDestroy
public void close() {
logger.info("Removing application {} from eureka", instanceConfig.getAppname());
DiscoveryManager.getInstance().shutdownComponent();
}
@Override
public void start() {
DiscoveryManager.getInstance().initComponent(instanceConfig, clientConfig);
}
@Override
public void stop() {
running = false;
}
@Override
public boolean isRunning() {
return running;
}
@Override
public int getPhase() {
return 0;
}
@Override
public boolean isAutoStartup() {
return true;
}
@Override
public void stop(Runnable callback) {
callback.run();
}
@Override
public int getOrder() {
return order;
}
}

View File

@@ -25,6 +25,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.context.ApplicationContext;
import org.springframework.context.SmartLifecycle;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.context.ServletContextAware;
import com.netflix.blitz4j.LoggingConfiguration;
@@ -42,7 +43,7 @@ import com.netflix.eureka.PeerAwareInstanceRegistry;
@ConditionalOnClass(EurekaServerConfig.class)
@ConditionalOnExpression("${eureka.server.enabled:true}")
public class EurekaServerAutoConfiguration implements ServletContextAware,
SmartLifecycle {
SmartLifecycle, Ordered {
@Autowired
private EurekaServerConfig eurekaServerConfig;
@@ -54,6 +55,8 @@ public class EurekaServerAutoConfiguration implements ServletContextAware,
private boolean running;
private int order = 0;
@Override
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
@@ -105,4 +108,9 @@ public class EurekaServerAutoConfiguration implements ServletContextAware,
callback.run();
}
@Override
public int getOrder() {
return order;
}
}

View File

@@ -17,6 +17,8 @@ package org.springframework.platform.netflix.eureka;
import static org.junit.Assert.assertEquals;
import java.util.Collections;
import org.junit.After;
import org.junit.Test;
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
@@ -24,6 +26,8 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.boot.test.EnvironmentTestUtils;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.CompositePropertySource;
import org.springframework.core.env.MapPropertySource;
/**
* @author Dave Syer
@@ -66,6 +70,24 @@ public class EurekaClientConfigBeanTests {
.getEurekaServerServiceUrls("defaultZone").toString());
}
@Test
public void serviceUrlWithCompositePropertySource() {
CompositePropertySource source = new CompositePropertySource("composite");
context.getEnvironment().getPropertySources().addFirst(source);
source.addPropertySource(new MapPropertySource("config", Collections
.<String, Object> singletonMap("eureka.client.serviceUrl.defaultZone",
"http://example.com")));
context.register(PropertyPlaceholderAutoConfiguration.class,
TestConfiguration.class);
context.refresh();
assertEquals("{defaultZone=http://example.com}",
context.getBean(EurekaClientConfigBean.class).getServiceUrl().toString());
assertEquals(
"[http://example.com]",
context.getBean(EurekaClientConfigBean.class)
.getEurekaServerServiceUrls("defaultZone").toString());
}
@Test
public void serviceUrlWithDefault() {
EnvironmentTestUtils.addEnvironment(context,