在Spring云配置刷新后如何执行自定义逻辑?

时间:2017-12-08 17:34:12

标签: java spring spring-boot spring-cloud spring-cloud-config

我的应用程序设置为使用Spring云配置提供配置并启用监视器,以便配置服务器将更改事件发布到我的应用程序。配置会正确更新,但我希望在配置更改时收到通知,以便我可以根据新配置执行一些自定义逻辑。

我有这个配置对象

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

这在我的配置服务器application.yml

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

现在,当我在配置中更改someValue,并且配置服务器发布刷新时,它会调用setSomeValue()并将值更新为新值。我可以将自定义逻辑添加到setSomeValue(),它将正常工作。但是,在更新或添加/删除configs中的条目时,它似乎不会调用setConfigs()或setField1()。

我尝试为EnviornmentChangeEvents,RefreshEvents或RefreshScopeRefreshedEvents注册一个侦听器,但这些侦听器在Spring更新值之前触发,或者根本没有触发。我还尝试向@PreDestroy和@PostConstruct方法添加逻辑,但只有PreDestroy最终被调用,并且在更新配置之前调用它。我也尝试实现InitializingBean并将我的逻辑放在afterPropertiesSet()中,但它永远不会被调用。

如何在此配置更新后收到通知?

1 个答案:

答案 0 :(得分: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());

    }

}

始终打印配置的新值。

如果你已经尝试过这个监听器,你确定它已经注册了吗?豆是否已正确创建?