据我了解,当您使用Spring Cloud的RefreshScope
注释时,会注入数据代理,如果更改了支持信息,代理会自动更新。不幸的是,我需要找到一种方法,以便在刷新时发出警报,以便我的代码可以重新读取刷新范围的bean中的数据。
简单示例:计划任务,其计划存储在Cloud Config中。除非你等到下一次执行任务(这可能需要一段时间)或定期轮询配置(这似乎很浪费),否则无法知道配置是否已更改。
答案 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
。考虑到属性已完成更新(您可以确保仅捕获更新的值),您可以为此使用一个侦听器。