@RefreshScope stops @Scheduled task

前端 未结 4 715
心在旅途
心在旅途 2020-12-11 22:48

I have a monitoring app wherein I am running a fixedRate task. This is pulling in a config parameter configured with Consul. I want to pull in updated configuration, so I ad

4条回答
  •  死守一世寂寞
    2020-12-11 23:09

    My solution consists of listening to EnvironmentChangeEvent

    @Configuration
    public class SchedulingSpringConfig implements ApplicationListener, SchedulingConfigurer {
    
      private static final Logger LOGGER = LoggerFactory.getLogger(SchedulingSpringConfig.class);
    
      private final DemoProperties demoProperties;
    
      public SchedulingSpringConfig(DemoProperties demoProperties) {
        this.demoProperties = demoProperties;
      }
    
      @Override
      public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        LOGGER.info("Configuring scheduled task with cron expression: {}", demoProperties.getCronExpression());
        taskRegistrar.addTriggerTask(triggerTask());
        taskRegistrar.setTaskScheduler(taskScheduler());
      }
    
      @Bean
      public TriggerTask triggerTask() {
        return new TriggerTask(this::work, cronTrigger());
      }
    
      private void work() {
        LOGGER.info("Doing work!");
      }
    
      @Bean
      @RefreshScope
      public CronTrigger cronTrigger() {
        return new CronTrigger(demoProperties.getCronExpression());
      }
    
      @Bean
      public ThreadPoolTaskScheduler taskScheduler() {
        return new ThreadPoolTaskScheduler();
      }
    
      @Override
      public void onApplicationEvent(EnvironmentChangeEvent event) {
        if (event.getKeys().contains("demo.config.cronExpression")) {
          ScheduledTasksRefresher scheduledTasksRefresher = new ScheduledTasksRefresher(triggerTask());
          scheduledTasksRefresher.afterPropertiesSet();
        }
      }
    }
    

    Then I use the ContextLifecycleScheduledTaskRegistrar to recreate the task.

    public class ScheduledTasksRefresher extends ContextLifecycleScheduledTaskRegistrar {
    
      private final TriggerTask triggerTask;
    
      ScheduledTasksRefresher(TriggerTask triggerTask) {
        this.triggerTask = triggerTask;
      }
    
      @Override
      public void afterPropertiesSet() {
        super.destroy();
        super.addTriggerTask(triggerTask);
        super.afterSingletonsInstantiated();
      }
    }
    

    Properties definition:

    @ConfigurationProperties(prefix = "demo.config", ignoreUnknownFields = false)
    public class DemoProperties {
    
      private String cronExpression;
    
      public String getCronExpression() {
        return cronExpression;
      }
    
      public void setCronExpression(String cronExpression) {
        this.cronExpression = cronExpression;
      }
    }
    

    Main definition:

    @SpringBootApplication
    @EnableConfigurationProperties(DemoProperties.class)
    @EnableScheduling
    public class DemoApplication {
    
      public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
      }
    }
    

提交回复
热议问题