如何防止Spring中重叠的时间表?
@Scheduled(fixedDelay = 5000) public void myJob() { Thread.sleep(12000); }
如果上一个例程尚未完成,如何防止此弹簧作业运行?
使用fixedDelay
,期间是在完成工作后测量的,所以不用担心。
默认情况下,spring使用单线程Executor。 所以没有两个@Scheduled任务会重叠。 甚至完全不相关的类中的两个@Scheduled方法也不会重叠,因为只有一个线程来执行所有@Scheduled任务。
此外,即使您使用基于线程池的执行程序替换默认的Executor,这些执行程序通常也会延迟任务实例的执行,直到先前计划的实例完成为止。 对于fixedDelay,fixedInterval和基于cron的计划,这是正确的。 例如,这个spring配置将创建一个使用线程池的ScheduledThreadPoolExecutor ,但不允许你想要的同一时间表的并发实例:
@Configuration @EnableScheduling ... public class MySpringJavaConfig { @Bean(destroyMethod = "shutdown") public Executor taskScheduler() { return Executors.newScheduledThreadPool(5); } ... }
这是ScheduledThreadPoolExecutor :: scheduleAtFixedRate的javadoc,它指定:
如果此任务的执行时间超过其周期,则后续执行可能会延迟,但不会同时执行。
注意:此function不适用于@Async任务 。 spring将根据需要创建尽可能多的并发实例(如果池中有足够的线程)。
- JUnit抛出java.lang.NoSuchMethodError对于com.google.common.collect.Iterables.tryFind
- 如何在Eclipse中使用Hibernate Tools生成DAO?
- Eclipse:从插件代码访问编辑器模板
- HTTP状态406. Spring MVC 4.0,jQuery,JSON
- Spring mongoTemplate线程安全吗?
- 处理exception的Java程序退出
- 如何在服务器和GWT客户端之间使用RSA?
- 如何用StringUtils.equals替换所有String.equals
- 在Java String.split()方法中使用转义字符处理分隔符