spring启动调度器,如果条件满足,则停止运行,并在第二天再次运行

zi8p0yeb  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(293)

我有一个调度程序(使用@scheduler)在晚上7点到9点之间每15分钟运行一次。它每15分钟查找一个文件。如果找到该文件,那么调度程序应该在今天停止,并在第二天再次运行。如何实现这一点在 Spring 开机?

clj7thdc

clj7thdc1#

可能最简单的方法是在业务逻辑级别实现它。spring提供了一种运行周期性任务的方法,这是真的,但是如果满足了业务案例(找到了文件),它就不能在一段时间内停止作业。
话虽如此,您可以按如下方式实施计划作业:

@Component
public class MyScheduledJob {
   private LocalDateTime runNextTime = null;
   private boolean isFileFound = false;

   @Scheduled(/**here comes your original cron expression: 7 am to 9 pm with an interval of 15 minutes as you say**/)
   public void runMe() {
     if(isFileFound && LocalDateTime.now().isBefore(runNextTime)) {
       // do not run a real job processing
       return;
     }

     isFileFound = checkWhetherFileExists();
     if(isFileFound) {
       runNextTime = calculateWhenDoYouWantToStartRunningTheActualJobProcessingNextTime();
     }

     ... do actual job processing... Its not clear from the question whether it should do something if the file is not found as well, but I'm sure you've got the point ...

   }
}

因为bean是一个单例,所以您可以安全地为它创建一个状态,没有人会改变这个状态。

wvyml7n5

wvyml7n52#

你可以这样做。您可以编写逻辑来检查此方法中的文件。

@Scheduled(fixedDelay = 1000, initialDelay = 1000)
    public void scheduleFixedRateWithInitialDelayTask() {

        long now = System.currentTimeMillis() / 1000;
        System.out.println(
          "Fixed-rate task with one-second initial delay - " + now);
    }

请参阅此以了解更多详细信息。

相关问题