检测 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】:

EnvironmentChangeEventEnvironment 发生变化时被触发。就 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 并做出反应 以几种标准方式进行更改(附加 ApplicationListeners 可以由用户正常添加为@Beans 方式)。

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

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

【讨论】:

EnvironmentChangedEvent 在启动时也被调用,这对我来说是毁了事情 @user2798694 event.getSource() 将为您提供最初发生事件的对象。也许通过检查源你可以过滤掉启动事件 @AliDehghani 环境更改事件没有获取源。只获取密钥 @user2798694 getSource 方法不是直接在EnvironmentChangeEvent 类中声明的,而是继承自java.util.EventObjectgetSource 方法。 @user2798694 看我的回答,RefreshScopeRefreshedEvent 不会在启动时被解雇

以上是关于检测 RefreshScope bean 的刷新的主要内容,如果未能解决你的问题,请参考以下文章

配置类中的@RefreshScope

Spring Cloud RefreshScope 刷新后挂钩

深入理解Spring Cloud一(4)Bean中的属性是如何刷新的?

SpringCloud Config手动刷新及自动刷新

springcloud刷新范围

Spring Cloud @RefreshScope 原理分析:扫描 Bean 定义