检测RefreshScope bean的刷新

时间:2016-02-10 17:50:47

标签: java spring spring-boot spring-cloud

据我了解,当您使用Spring Cloud的RefreshScope注释时,会注入数据代理,如果更改了支持信息,代理会自动更新。不幸的是,我需要找到一种方法,以便在刷新时发出警报,以便我的代码可以重新读取刷新范围的bean中的数据。

简单示例:计划任务,其计划存储在Cloud Config中。除非你等到下一次执行任务(这可能需要一段时间)或定期轮询配置(这似乎很浪费),否则无法知道配置是否已更改。

4 个答案:

答案 0 :(得分:11)

当刷新发生时,您的配置客户端会引发EnvironmentChangeEvent,如文档所述:

  

应用程序将侦听EnvironmentChangedEvent并做出反应   改变几种标准方式(另外   用户可以在正常情况下将ApplicationListener添加为@Bean个   方式)。

因此,您可以为此事件定义事件侦听器:

public class YourEventListener implements ApplicationListener<EnvironmentChangeEvent> {
    @Override
    public void onApplicationEvent(EnvironmentChangeEvent event) {
        // do stuff
    }
}

答案 1 :(得分:5)

EnvironmentChangeEvent发生变化时,

Environment会被触发。就Spring Cloud Config而言,它意味着在调用/env执行器端点时触发它。

启动RefreshScopeRefreshedEvent bean的刷新时会触发

@RefreshScope,例如/refresh致动器端点被调用。

这意味着你需要注册ApplicationListener<RefreshScopeRefreshedEvent>

@Configuration
public class AppConfig {

    @EventListener(RefreshScopeRefreshedEvent.class)
    public void onRefresh(RefreshScopeRefreshedEvent event) {
        // Your code goes here...
    }

}

答案 2 :(得分:1)

我认为一种方法可以用@RefreshScope注释所有具有由配置外化的属性并在@Value ( "${your.prop.key}" )注释中注释的bean。

这些属性在配置更改后会更新。

答案 3 :(得分:0)

更具体地说,在范围RefreshScope下刷新属性和应用程序上下文之后,将触发事件RefreshScopeRefreshedEvent。考虑到属性已完成更新(您可以确保仅捕获更新的值),您可以为此使用一个侦听器。