2017-12-08 6 views
2

Ich habe meine Anwendung so eingerichtet, dass sie die Spring-Cloud-Konfiguration für die Konfiguration verwendet und den Monitor aktiviert hat, damit der Konfigurationsserver Änderungsereignisse an meine Anwendung sendet. Die Konfiguration wird korrekt aktualisiert, aber ich möchte benachrichtigt werden, wenn sich die Konfiguration ändert, damit ich eine benutzerdefinierte Logik basierend auf der neuen Konfiguration ausführen kann.Wie kann ich benutzerdefinierte Logik nach der Aktualisierung der Spring Cloud-Konfiguration ausführen?

Ich habe dieses Konfigurationsobjekt

@Configuration 
@RefreshScope 
@ConfigurationProperties(prefix = "my.prefix") 
public class MyConfig { 
    private Map<String, MyObject> configs; 
    private String someValue; 

    public Map<String, MyObject> getConfigs(){...} 
    public void setConfigs(){...} 

    public String getSomeValue(){...} 
    public void setSomeValue(){...} 
} 
... 
public class MyObject { 
    private String field1; 

    public String getField1() {...} 
    public void setField1() {...} 
} 

Und das in meinem Config Server application.yml

my: 
    prefix: 
    configs: 
     TEST: 
     field1: "testValue" 
    someValue: "test" 

Nun, wenn ich somevalue in der Konfiguration zu ändern, und der Config-Server veröffentlicht eine Aktualisierung es, ruft setSomeValue() auf und aktualisiert den Wert auf den neuen Wert. Ich kann meine eigene Logik zu SetSomeValue() hinzufügen und es wird gut funktionieren. Es scheint jedoch nicht SetConfigs() oder SetField1() beim Aktualisieren oder Hinzufügen/Entfernen von Einträgen aus den Konfigurationen aufzurufen.

Ich habe versucht, einen Listener für EnviornmentChangeEvents, RefreshEvents oder RefreshScopeRefreshedEvents zu registrieren, aber diese werden entweder ausgelöst, bevor Spring die Werte aktualisiert oder überhaupt nicht ausgelöst wird. Ich habe auch versucht, @PreDestroy- und @PostConstruct-Methoden Logik hinzuzufügen, aber nur PreDestroy wird aufgerufen und aufgerufen, bevor die Konfiguration aktualisiert wird. Ich habe auch versucht, InitializingBean zu implementieren und meine Logik in afterPropertiesSet() zu setzen, aber es wird auch nie aufgerufen.

Wie kann ich benachrichtigt werden, wenn diese Konfiguration aktualisiert wird?

Antwort

1

Mit einem RefreshScopeRefreshedEvent Listener können Sie benachrichtigt werden, wenn die Konfiguration aktualisiert wird.

Das folgende Beispiel funktioniert für mich:

Die Konfiguration:

@Configuration 
public class Config { 
    @Bean 
    @RefreshScope 
    public A aBean() { 
     return new A(); 
    } 

    @Bean 
    public RefreshScopeRefreshedListener remoteApplicationEventListener(A aBean) { 
     return new RefreshScopeRefreshedListener(aBean); 
    } 

} 

Und der Zuhörer:

public class RefreshScopeRefreshedListener implements ApplicationListener<RefreshScopeRefreshedEvent> { 
    private A aBean; 

    public RefreshScopeRefreshedListener(A abean) { 
     this.aBean = abean; 
    } 

    @Override 
    public void onApplicationEvent(RefreshScopeRefreshedEvent event) { 
     System.out.println(aBean.getValue()); 

    } 

} 

Es immer den neuen Wert der Konfiguration drucken.

Wenn Sie diesen Zuhörer bereits ausprobiert haben, sind Sie sicher, dass er gut registriert wurde? Die Bean wurde korrekt erstellt?

Verwandte Themen