Commit 29eea6d9 by Dave Syer

Call postInit() aggressively on InstanceRegistry

To avoid possible NPE when the registry is used before it is initialized. Fixes gh-97
parent 67878cfe
...@@ -17,6 +17,7 @@ package org.springframework.cloud.netflix.eureka.server; ...@@ -17,6 +17,7 @@ package org.springframework.cloud.netflix.eureka.server;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
...@@ -56,6 +57,7 @@ import com.netflix.discovery.converters.XmlXStream; ...@@ -56,6 +57,7 @@ import com.netflix.discovery.converters.XmlXStream;
import com.netflix.eureka.EurekaBootStrap; import com.netflix.eureka.EurekaBootStrap;
import com.netflix.eureka.EurekaServerConfig; import com.netflix.eureka.EurekaServerConfig;
import com.netflix.eureka.EurekaServerConfigurationManager; import com.netflix.eureka.EurekaServerConfigurationManager;
import com.netflix.eureka.InstanceRegistry;
import com.netflix.eureka.PeerAwareInstanceRegistry; import com.netflix.eureka.PeerAwareInstanceRegistry;
/** /**
...@@ -189,11 +191,18 @@ public class EurekaServerInitializerConfiguration implements ServletContextAware ...@@ -189,11 +191,18 @@ public class EurekaServerInitializerConfiguration implements ServletContextAware
public void onApplicationEvent(EurekaRegistryAvailableEvent event) { public void onApplicationEvent(EurekaRegistryAvailableEvent event) {
if (instance == null) { if (instance == null) {
instance = PeerAwareInstanceRegistry.getInstance(); instance = PeerAwareInstanceRegistry.getInstance();
safeInit();
replaceInstance(getProxyForInstance()); replaceInstance(getProxyForInstance());
expectRegistrations(1); expectRegistrations(1);
} }
} }
private void safeInit() {
Method method = ReflectionUtils.findMethod(InstanceRegistry.class, "postInit");
ReflectionUtils.makeAccessible(method);
ReflectionUtils.invokeMethod(method, instance);
}
private void replaceInstance(Object proxy) { private void replaceInstance(Object proxy) {
Field field = ReflectionUtils.findField(PeerAwareInstanceRegistry.class, Field field = ReflectionUtils.findField(PeerAwareInstanceRegistry.class,
"instance"); "instance");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment