检测 RefreshScope bean 的刷新
Posted
技术标签:
【中文标题】检测 RefreshScope bean 的刷新【英文标题】:Detecting refreshing of RefreshScope beans 【发布时间】:2016-05-21 05:34:07 【问题描述】:据我了解,当您使用 Spring Cloud 的RefreshScope
注解时,会注入数据的代理,如果支持信息发生更改,代理会自动更新。不幸的是,我需要找到一种在刷新发生时发出警报的方法,以便我的代码可以从刷新范围的 bean 中重新读取数据。
简单示例:计划存储在 Cloud Config 中的计划任务。除非您等到下一次执行任务(这可能需要一段时间)或定期轮询配置(这似乎很浪费),否则无法知道配置是否已更改。
【问题讨论】:
希望使用 refreshevent 会对您有所帮助。我使用与您类似的方法。计划任务的计划在配置中,这将使用 RefreshEvent 自动更新。此处提供了一个示例应用程序github.com/winster/SpringSchedulerDynamic。此应用程序优雅地加载具有新计划的预定作业,并且具有旧计划的先前作业优雅地完成。现在,当我在类路径中添加一个 opentracing 库时,它再次中断。这意味着,在刷新时,将使用新计划创建一个新的计划作业,并保留旧计划。你知道这里出了什么问题吗? 【参考方案1】:更具体地说,在RefreshScope
范围内的属性和应用程序上下文刷新后,会触发一个事件RefreshScopeRefreshedEvent
。鉴于属性已完成更新(您可以确保仅捕获更新的值),您可以为此设置一个侦听器。
【讨论】:
【参考方案2】:EnvironmentChangeEvent
在Environment
发生变化时被触发。就 Spring Cloud Config 而言,这意味着它在调用 /env
执行器端点时触发。
RefreshScopeRefreshedEvent
在启动 @RefreshScope
bean 的刷新时触发,例如/refresh
执行器端点被调用。
这意味着你需要像这样注册ApplicationListener<RefreshScopeRefreshedEvent>
:
@Configuration
public class AppConfig
@EventListener(RefreshScopeRefreshedEvent.class)
public void onRefresh(RefreshScopeRefreshedEvent event)
// Your code goes here...
【讨论】:
【参考方案3】:我认为一种方法可以是使用@RefreshScope
注释所有具有配置外部化属性并在@Value ( "$your.prop.key" )
注释中注释的bean。
这些属性会在配置更改时更新。
【讨论】:
【参考方案4】:当刷新发生时,EnvironmentChangeEvent
将在您的配置客户端中引发,如文档所述:
应用程序将侦听
EnvironmentChangedEvent
并做出反应 以几种标准方式进行更改(附加ApplicationListener
s 可以由用户正常添加为@Bean
s 方式)。
因此,您可以为此事件定义事件侦听器:
public class YourEventListener implements ApplicationListener<EnvironmentChangeEvent>
@Override
public void onApplicationEvent(EnvironmentChangeEvent event)
// do stuff
【讨论】:
EnvironmentChangedEvent 在启动时也被调用,这对我来说是毁了事情 @user2798694event.getSource()
将为您提供最初发生事件的对象。也许通过检查源你可以过滤掉启动事件
@AliDehghani 环境更改事件没有获取源。只获取密钥
@user2798694 getSource
方法不是直接在EnvironmentChangeEvent
类中声明的,而是继承自java.util.EventObject
的getSource
方法。
@user2798694 看我的回答,RefreshScopeRefreshedEvent
不会在启动时被解雇以上是关于检测 RefreshScope bean 的刷新的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud RefreshScope 刷新后挂钩