我有一个每小时运行一次的作业,我正在使用 Spring 的 @scheduled cron 来安排它。
如果工作需要一个多小时,我从How to prevent overlapping schedules in Spring?了解到在第一个作业运行时,下一个作业不会启动。
但这是否意味着它会在第一份工作完成后开始,还是错过了机会?
如果我有一个需要 10 小时的作业,所有错过的 cron 作业是否会排队,然后在第一个作业在 10 小时后完成时一个接一个地执行,还是只运行第一个作业?
谢谢!
最佳答案
默认情况下,执行是阻塞的和单线程的,这意味着它们不会并发运行。如果您希望作业同时运行,您也可以将该方法注释为 @Async
。您可能还想查看不同的 Executors
.
如果您像在您提供的示例问题中那样使用 fixedDelay
,下一个作业只会在当前作业结束后开始,加上延迟。因此,如果您的工作需要 10 小时,并且您的 fixedDelay
为 5000
,则下一个工作将在 10 小时后的 5 秒后开始。
如果您正在使用 fixedRate
,那么下一个预定事件将排队等待运行,但不会跳过,根据 documentation :
If any execution of this task takes longer than its period, then subsequent executions may start late, but will not concurrently execute.
如果您只是简单地使用cron
,那么作业将依次排队和执行(类似于fixedRate
)。您可以使用一个简单的方法对此进行测试(下面是在 Groovy 中,但也可以使用纯 Java):
int i = 0
@Scheduled(cron = '* * * * * * ')
void test() {
if (i < 5)
Thread.sleep(10000)
i += 1
println '------------------------' + i // No values skipped
}
您会注意到打印了每个数字;例如不会跳过任何循环。
关于java - 当作业重叠时,spring @scheduled cron 的预期行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48114936/