Spring Boot:在上下文加载时和属性更改时捕获事件

时间:2018-05-02 13:04:24

标签: spring-boot spring-cloud spring-cloud-config

我想在应用程序启动后立即执行自定义逻辑,并且每当Spring Cloud配置repo / server中的属性发生更改时。所以我写了这样的东西:

import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfiguration implements ApplicationListener<EnvironmentChangeEvent> {

    @Override
    public void onApplicationEvent(EnvironmentChangeEvent event) {
        // Custom logic goes here. It should be executed on both app context load time
        // and on any property change time

    }

}

上面的代码在应用程序加载时间和属性更改期间几个月前就开始工作了。但是这个代码最近停止了工作,我想,Spring启动/云版本更新。

目前我正在使用 Sprig boot 1.5.10 和Cloud Edgware.SR3

1 个答案:

答案 0 :(得分:0)

找到一种方法来运行自定义逻辑,以便在加载时和属性更改时运行它。

基本上改为上面的代码,要在任何事件上调用,然后在重写的methood onApplicationEvent中仅检查下面的事件

  1. ContextRefreshedEvent - 初始化或刷新应用程序上下文时引发的事件。
  2. EnvironmentChangeEvent - 发布事件以表示环境中的更改,例如config repo中的属性。

    import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
    import org.springframework.context.ApplicationEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.event.ContextRefreshedEvent;
    
    public class AppConfiguration implements ApplicationListener<ApplicationEvent> {
    
      @Override
      public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof EnvironmentChangeEvent || event instanceof ContextRefreshedEvent) {
           // Custom logic goes here. It should be executed on both app context load time 
           // and on any property change time
        }
      }
    }
    
  3. <强>更新

    我们也可以使用 @EventListener 注释来做类似的事情,这非常简单易用。请参阅以下示例:

    @Configuration
    public class AppConfiguration {
    
        @EventListener({EnvironmentChangeEvent.class, ContextRefreshedEvent.class})
        public void onRefresh() {
            // Your code goes here...
        }
    
    }