Spring Boot条件时间表

时间:2018-06-25 22:37:22

标签: java spring spring-boot

我知道可以以固定的速率,固定的延迟或使用克朗来运行计划。但是我该如何处理这种情况:

Method A (fixed delay 60 seconds but should never run if B or C is running)
Method B (supposed to run every hour and ALWAYS before C)
Method C (supposed to run 60 seconds after B has finished)

如何设置这些条件?

编辑:

我设法做到了,而且似乎可行:

@Scheduled(fixedDelay = 10000)
public void A() {
}

@Scheduled(fixedDelay = 60000)
public void BandC() throws InterruptedException {
    MethodB
    Thread.sleep(60000);
    MethodC
}

这是正确的还是出于某种原因使它做错了?

1 个答案:

答案 0 :(得分:0)

看看如何使用带有@SchedulerLock批注的调度程序锁。这样可以确保仅一次运行A,B和C:

https://github.com/lukas-krecan/ShedLock

您可能必须在调度代码中提供一些其他信息,以确保C始终在B之后,但是如果正确设置了调度任务的开始时间,则锁定也将有助于强制执行该顺序。

或者在给定的时序条件下,您可以让B调度C在B终止时运行一次。锁定机制以及对C调度位置的一些思考可能会解决您的问题。