首页 > 解决方案 > 如何通过传递布尔标志来禁用或启用作业来控制所有按计划 cron 作业运行的春季批处理作业?

问题描述

我创建了一个作业状态表,其中我有一个布尔标志,基于我正在返回 cron 表达式(活动 cron 或 hypen(-) cron),我的调度程序将工作。如果要启用或禁用所有 Spring 批处理作业,布尔标志将被更新。

我们如何控制应用程序中的标志,否则我们在运行 cron 表达式时会遇到问题?

@Scheduled(cron = "#{@getCronValueDevice}")
@Scheduled(cron = "#{@getCronValueStorage}")

@Bean
public String getCronValueDevice() {
    JobStatus jobStatus = jobStatusRepository.findByJobName(BatchJobConstants.DEVICE_JOB_NAME);
    if (jobStatus != null && jobStatus.getIsActive()) {
        return jobStatus.getActiveCronExpression();
    } else {
        return "-";
    }

标签: spring-batch

解决方案


如果目标是使用标志启用/禁用计划作业,我会保持简单,并使作业启动代码以该标志为条件,例如:

@Scheduled(cron = "#{your.cron.expression}")
public void runJob() {
   boolean enabled = ... // dynamically load the flag as needed
   if (enabled) {
      // run the job
   }
}

这不需要动态更改 cron 表达式来启用/禁用计划。当标志为假时,除非再次重新激活,否则作业将不会在后续计划中执行。

顺便说一句,kubernetes 提供了一个类似的功能来暂停/恢复 cron 作业(这可以通过修补 cron 作业规范来即时完成)。


推荐阅读