Browse Source

Fix race condition in server

pull/6/head
Dave Syer 10 years ago
parent
commit
88f79507e3
  1. 51
      spring-platform-netflix-core/src/main/java/org/springframework/platform/netflix/eureka/EurekaClientAutoConfiguration.java
  2. 10
      spring-platform-netflix-core/src/main/java/org/springframework/platform/netflix/eureka/EurekaServerAutoConfiguration.java
  3. 22
      spring-platform-netflix-core/src/test/java/org/springframework/platform/netflix/eureka/EurekaClientConfigBeanTests.java

51
spring-platform-netflix-core/src/main/java/org/springframework/platform/netflix/eureka/EurekaClientAutoConfiguration.java

@ -15,7 +15,6 @@ @@ -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; @@ -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; @@ -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 @@ -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;
}
}

10
spring-platform-netflix-core/src/main/java/org/springframework/platform/netflix/eureka/EurekaServerAutoConfiguration.java

@ -25,6 +25,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties @@ -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; @@ -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, @@ -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, @@ -105,4 +108,9 @@ public class EurekaServerAutoConfiguration implements ServletContextAware,
callback.run();
}
@Override
public int getOrder() {
return order;
}
}

22
spring-platform-netflix-core/src/test/java/org/springframework/platform/netflix/eureka/EurekaClientConfigBeanTests.java

@ -17,6 +17,8 @@ package org.springframework.platform.netflix.eureka; @@ -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 @@ -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 { @@ -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,

Loading…
Cancel
Save