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

如果上一个例程尚未完成,如何阻止此春季作业运行?

有帮助吗?

解决方案

与世代陶醉架码,工作时间术后测量,所以不用担心。

其他提示

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

此外,即使您使用基于线程池的执行器替换默认的执行器,这些执行器通常也会延迟任务实例的执行,直到先前调度的实例完成。这对于 固定延迟、固定间隔和 cron 为基础的时间表。例如,这个 spring 配置将创建一个 调度线程池执行器 它使用线程池,但不允许如您所愿的同一调度的并发实例:

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

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

如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top