我的应用程序设置为使用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()中,但它永远不会被调用。
如何在此配置更新后收到通知?
答案 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());
}
}
始终打印配置的新值。
如果你已经尝试过这个监听器,你确定它已经注册了吗?豆是否已正确创建?