gpt4 book ai didi

java - 如何防止 Spring 中的计划重叠?

转载 作者:IT老高 更新时间:2023-10-28 13:44:07 25 4
gpt4 key购买 nike

@Scheduled(fixedDelay = 5000)
public void myJob() {
Thread.sleep(12000);
}

如果之前的例程还没有完成,如何防止这个 spring 作业运行?

最佳答案

默认情况下,spring 使用单线程 Executor。所以没有两个@Scheduled 任务会重叠。即使是完全不相关的类中的两个@Scheduled 方法也不会因为只有一个线程来执行所有@Scheduled 任务而重叠。

此外,即使您将默认的 Executor 替换为基于线程池的 Executor,这些 Executor 通常也会延迟任务实例的执行,直到之前计划的实例完成。这适用于基于 fixedDelay、fixedInterval 和 cron 的计划。例如,这个 spring 配置将创建一个 ScheduledThreadPoolExecutor,它使用一个线程池,但不允许您希望的相同调度的并发实例:

@Configuration
@EnableScheduling
...
public class MySpringJavaConfig {
@Bean(destroyMethod = "shutdown")
public Executor taskScheduler() {
return Executors.newScheduledThreadPool(5);
}
...
}

这里是 javadoc for ScheduledThreadPoolExecutor::scheduleAtFixedRate其中指定:

If any execution of this task takes longer than its period, then subsequent executions may start late, but will not concurrently execute.

注意:此功能不适用于 @Async 任务。 spring 将根据需要创建尽可能多的并发实例(如果池中有足够的线程)。

关于java - 如何防止 Spring 中的计划重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24033208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com