@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 http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html#scheduleAtFixedRate-java.lang.Runnable-long-long-java.util.concurrent.TimeUnit-其中指定:
如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行。
注意:此功能不适用于@异步任务。 spring 将根据需要创建尽可能多的并发实例(如果池中有足够的线程)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)