【问题标题】:Detecting refreshing of RefreshScope beans检测 RefreshScope bean 的刷新
【发布时间】:2016-05-21 05:34:07
【问题描述】:

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

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

【问题讨论】:

  • 希望使用 refreshevent 会对您有所帮助。我使用与您类似的方法。计划任务的计划在配置中,这将使用 RefreshEvent 自动更新。此处提供了一个示例应用程序github.com/winster/SpringSchedulerDynamic。此应用程序优雅地加载具有新计划的预定作业,并且具有旧计划的先前作业优雅地完成。现在,当我在类路径中添加一个 opentracing 库时,它再次中断。这意味着,在刷新时,将使用新计划创建一个新的计划作业,并保留旧计划。你知道这里出了什么问题吗?

标签: java spring spring-boot spring-cloud


【解决方案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 不会在启动时被解雇
        猜你喜欢
        • 2017-07-15
        • 2016-08-06
        • 1970-01-01
        • 2021-10-24
        • 2019-01-24
        • 2023-03-25
        • 2011-10-14
        • 2011-05-16
        • 2011-09-30
        相关资源
        最近更新 更多