Spring @Scheduler重叠

时间:2017-07-14 14:03:11

标签: spring-scheduled

我有两种方法可以定期运行spring scheduler,一种是@Scheduled(fixedRate = 300000) - 每5分钟一次  另一个是@Scheduled(cron =“0 0 0 2 * *?) - 每天凌晨2点。我们没有使用taskScheduler和线程池,所以它只使用一个线程  所以没有重叠。

我观察到的是,当5分钟的工作花费更多时间(比如说> 30分钟)时,不允许其他@Scheduled作业运行。假设我的5分钟工作在凌晨1点45分开始并且需要45分钟来处理,其他cron假设在凌晨2点开始无法启动,因为线程在5分钟的工作中忙碌。是否有任何设置,其他2点工作将在线程发布后立即启动。在这种情况下,帮助我们理解线程的行为。

1 个答案:

答案 0 :(得分:2)

默认情况下,Spring scheduler为作业执行提供单个线程。您可以配置具有多个线程和队列的任务执行程序,以便即使所有线程都忙,也会将作业添加到队列中,并在线程空闲后立即获取。

以下示例创建一个简单的ScheduledThreadPool。

@EnableScheduling
@Configuration
public class Configuration implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar 
     scheduledTaskRegistrar) {
        scheduledTaskRegistrar.setScheduler(taskExecutor());
    }

    @Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(5);
    }
}