2017-12-08 8 views
2

設定を提供するためにSpringクラウド設定を使用するようにアプリケーションを設定し、設定サーバーが変更イベントを自分のアプリケーションに公開するようにモニターを有効にしました。設定は正しく更新されますが、新しい設定に基づいてカスタムロジックを実行できるように設定が変更されたときに通知する必要があります。Springクラウド設定の更新後にカスタムロジックを実行するにはどうしたらいいですか?

は私が構成でsomeValueのを変更したときに、私のconfigサーバで

@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() {...} 
} 

そして、これが今

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

をapplication.ymlこの構成オブジェクトがあり、コンフィグサーバは、リフレッシュを発行し、それをsetSomeValue()を呼び出し、値を新しい値に更新します。私はカスタムロジックをsetSomeValue()に追加することができ、うまく動作します。しかし、configConfigs()やsetField1()を呼び出すようには見えません。

EnviornmentChangeEvents、RefreshEvents、またはRefreshScopeRefreshedEventsのリスナーを登録しようとしましたが、Springが値を更新する前にトリガーされるか、まったくトリガーされません。 @PreDestroyと@PostConstructメソッドにロジックを追加しようとしましたが、PreDestroyだけが呼び出されて終了し、設定が更新される前に呼び出されます。私はInitializingBeanを実装して、私のロジックをafterPropertiesSet()に入れてみましたが、どちらも呼び出されません。

この設定が更新されたときにどのように通知を受けることができますか?

答えて

1

RefreshScopeRefreshedEventリスナーを使用すると、構成の更新時に通知を受け取ることができます。

次の例では、私の作品:

設定:

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

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

} 

そしてリスナー:

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()); 

    } 

} 

それは常に設定の新しい値を印刷します。

このリスナーを試したことがある場合は、正しく登録されていることを確認してください。 Beanは正しく作成されていますか?

関連する問題