春季计划

时间:2020-05-06 13:18:47

标签: java spring spring-boot

我有一个cron表达式,每天下午7点运行。
我正在使用最新版的Spring Boot。

      @Scheduled(cron = "${my.cron.expression}")
        public void scheduleTask(){
          //call service layer where business logic resides
          //other autowired beans here

}

我有2个疑问。

Q1)我如何确保仅在旧实例完成运行后才执行CRON JOB。

Q2)如何为每个CRON JOB调用重新加载/刷新应用程序上下文并重新加载所有bean?

3 个答案:

答案 0 :(得分:0)

第二点,看一下spring-cloud-config和客户端库spring-cloud-config-client。有一个HTTP端点可以刷新bean

我必须为任何分布式操作(例如消息队列,数据库)创建存储空间。

答案 1 :(得分:0)

对于您的Q1:建议您使用类级布尔变量,例如isRunning,如下所示

 public class scheduler {
    private boolean isRunning = false;

    @Scheduled(cron = "${my.cron.expression}")
    public void scheduleTask(){
       if(!isRunning) {
          isRunning = true;
          // executions goes here
       }
       isRunning = false;
   }
}

第二季度:重新加载bean

public class scheduler {
    private boolean isRunning = false;

    @Scheduled(cron = "${my.cron.expression}")
    public void scheduleTask(){
       if(!isRunning) {
          isRunning = true;
          // executions goes here
       }
       isRunning = false;
       DefaultSingletonBeanRegistry registry = (DefaultSingletonBeanRegistry) 
       context.getBeanFactory();
       registry.destroySingleton({yourbean}) //destroys the bean object
       registry.registerSingleton({yourbeanname}, {newbeanobject}) //add to singleton beans cache
   }
}

答案 2 :(得分:-1)

fixedDelay属性可确保在任务执行的完成时间与任务下次执行的开始时间之间有n毫秒的延迟。

@Schedules({ 
  @Scheduled(fixedDelay = 1000), 
  @Scheduled(cron = "${my.cron.expression}")
})