我有两种方法可以定期运行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点工作将在线程发布后立即启动。在这种情况下,帮助我们理解线程的行为。
答案 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);
}
}