2017-02-15 1 views
1

Kürzlich begann ich an Netflix-Hystrix-Bibliothek zu arbeiten. Ich habe ein HystrixCommand-Objekt erstellt, aber ich erhalte eine NPE. Im Idealfall sollte es nicht passieren. Jede Hilfe wird geschätzt. Ist es ein bekanntes Problem?Null-Zeiger-Ausnahme in Netflix-Hystrix-Bibliothek

Sie finden den Stack-Trace:

Exception in thread "main" java.lang.NullPointerException 
    at com.netflix.config.ConcurrentMapConfiguration.clearConfigurationListeners(ConcurrentMapConfiguration.java:330) 
    at org.apache.commons.configuration.event.EventSource.<init>(EventSource.java:76) 
    at org.apache.commons.configuration.AbstractConfiguration.<init>(AbstractConfiguration.java:63) 
    at com.netflix.config.ConcurrentMapConfiguration.<init>(ConcurrentMapConfiguration.java:68) 
    at com.netflix.config.ConcurrentCompositeConfiguration.<init>(ConcurrentCompositeConfiguration.java:172) 
    at com.netflix.config.ConfigurationManager.getConfigInstance(ConfigurationManager.java:125) 
    at com.netflix.config.DynamicPropertyFactory.getInstance(DynamicPropertyFactory.java:263) 
    at com.netflix.config.DynamicProperty.getInstance(DynamicProperty.java:245) 
    at com.netflix.config.PropertyWrapper.<init>(PropertyWrapper.java:58) 
    at com.netflix.hystrix.strategy.properties.archaius.HystrixDynamicPropertiesArchaius$ArchaiusDynamicProperty.<init>(HystrixDynamicPropertiesArchaius.java:62) 
    at com.netflix.hystrix.strategy.properties.archaius.HystrixDynamicPropertiesArchaius$StringDynamicProperty.<init>(HystrixDynamicPropertiesArchaius.java:73) 
    at com.netflix.hystrix.strategy.properties.archaius.HystrixDynamicPropertiesArchaius.getString(HystrixDynamicPropertiesArchaius.java:34) 
    at com.netflix.hystrix.strategy.HystrixPlugins.getPluginImplementationViaProperties(HystrixPlugins.java:344) 
    at com.netflix.hystrix.strategy.HystrixPlugins.getPluginImplementation(HystrixPlugins.java:334) 
    at com.netflix.hystrix.strategy.HystrixPlugins.getPropertiesStrategy(HystrixPlugins.java:243) 
    at com.netflix.hystrix.strategy.properties.HystrixPropertiesFactory.getCommandProperties(HystrixPropertiesFactory.java:62) 
    at com.netflix.hystrix.AbstractCommand.initCommandProperties(AbstractCommand.java:204) 
    at com.netflix.hystrix.AbstractCommand.<init>(AbstractCommand.java:163) 
    at com.netflix.hystrix.HystrixCommand.<init>(HystrixCommand.java:61) 

Antwort

2

ich ähnliches Problem konfrontiert, und hier ist, wie ich es gelöst.

Hystrix -> verwendet archaius-Core-0.4.1.jar -> die commons-Konfiguration-1.8.jar

Aber aufgrund jar Konflikte in meinem aktuellen Projekt, commons-Konfiguration-1.3.jar verwendet, ist präsentieren statt commons-Konfiguration-1.8.jar

Leider gibt einen Fehler in commons-Konfiguration-1.3.jar im Konstruktor von org.apache.commons.configuration.event.EventSource zu sein scheint (was ich (wird unten erklärt)

Also, mein Vorschlag ist ein Blick in Ihren Klassenpfad und ich bin su Sie finden commons-configuration-1.3.jar. Wenn ja, stellen Sie sicher, dass Sie die richtige commons-configuration-1.8.jar haben. Dies sollte dein Problem lösen!

Root Cause:

com.netflix.config.ConcurrentMapConfiguration -> ist eine Unterklasse von org.apache.commons.configuration.AbstractConfiguration -> die eine Unterklasse von org.apache.commons ist .configuration.event.EventSource

ist hier das Skelett

public class ConcurrentMapConfiguration extends AbstractConfiguration { 
    ... 
    private Collection<ConfigurationListener> listeners = new CopyOnWriteArrayList<ConfigurationListener>();  
    ... 
    public ConcurrentMapConfiguration() { 
     ... 
    } 
    ... 
    @Override 
    public void clearConfigurationListeners() { 
     listeners.clear(); // Here is the null pointer exception 
    } 
    ... 
} 

Aber in Eventsource (commons-Konfiguration-1.3.jar)

Wie Sie im Konstruktor von EventSource deutlich sehen, sehen Sie einen Aufruf der Methode clearConfigurationListeners(). Und diese Methode wurde in der Unterklasse ConcurrentMapConfiguration überschrieben. Also wird die Unterklassenmethode aufgerufen. Aber zu diesem Zeitpunkt ist der Listener immer noch Null, denn erst nachdem der Superklassenkonstruktor fertig ist, kann die Unterklasse mit der Initialisierung beginnen. Daher die NPE.

Aber in Eventsource (commons-Konfiguration-1.4.jar und höher) - es ist fest

public class EventSource { 
    ... 
    public EventSource() 
    { 
     initListeners(); // this is good 
    } 
    ... 
    private void initListeners() // private method... Much better! No one can override this :) 
    { 
     listeners = new LinkedList(); 
     ... 
    } 
    ... 
} 

hoffe, das hilft!

Verwandte Themen