您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何防止spring时间安排重叠?

如何防止spring时间安排重叠?

使用fixedDelay,该时间段是在工作完成后计算的,因此无需担心。

认情况下,spring使用单线程执行器。因此,没有两个@Scheduled任务会重叠。甚至完全不相关的类中的两个@Scheduled方法也不会重叠,这仅仅是因为只有一个线程可以执行所有@Scheduled任务。

此外,即使你将认的执行器替换为基于线程池的执行器,这些执行器通常也会延迟任务实例的执行,直到先前计划的实例完成为止。对于fixedDelay,fixedInterval和基于cron的计划,这是正确的。例如,此spring配置将创建一个使用线程池的ScheduledThreadPoolExecutor,但不允许按照你期望的方式并发同一时间表的实例:

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

这是ScheduledThreadPoolExecutor :: scheduleAtFixedRate的Javadoc,它指定:

如果此任务的任何执行花费的时间超过其时间,则后续执行可能会开始得较晚,但不会同时执行。

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

Java 2022/1/1 18:19:26 有500人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶