Call postInit() aggressively on InstanceRegistry

To avoid possible NPE when the registry is used before it is initialized.

Fixes gh-97
This commit is contained in:
Dave Syer
2014-12-09 15:11:27 +00:00
parent 67878cfebd
commit 29eea6d9b6

View File

@@ -17,6 +17,7 @@ package org.springframework.cloud.netflix.eureka.server;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import javax.servlet.ServletContext;
@@ -56,6 +57,7 @@ import com.netflix.discovery.converters.XmlXStream;
import com.netflix.eureka.EurekaBootStrap;
import com.netflix.eureka.EurekaServerConfig;
import com.netflix.eureka.EurekaServerConfigurationManager;
import com.netflix.eureka.InstanceRegistry;
import com.netflix.eureka.PeerAwareInstanceRegistry;
/**
@@ -189,11 +191,18 @@ public class EurekaServerInitializerConfiguration implements ServletContextAware
public void onApplicationEvent(EurekaRegistryAvailableEvent event) {
if (instance == null) {
instance = PeerAwareInstanceRegistry.getInstance();
safeInit();
replaceInstance(getProxyForInstance());
expectRegistrations(1);
}
}
private void safeInit() {
Method method = ReflectionUtils.findMethod(InstanceRegistry.class, "postInit");
ReflectionUtils.makeAccessible(method);
ReflectionUtils.invokeMethod(method, instance);
}
private void replaceInstance(Object proxy) {
Field field = ReflectionUtils.findField(PeerAwareInstanceRegistry.class,
"instance");