我有两种使用spring scheduler定期运行的方法,一种是@Scheduled(fixedRate=300000) -每5分钟一次,另一种是@Scheduled(cron="0 0 0 2** ?) -每天凌晨2点我们不使用线程池的taskScheduler,所以它只使用一个线程,所以没有重叠。
我观察到的是,当5分钟的作业花费更多的时间(比如> 30分钟)时,就不允许其他@Scheduled作业运行。假设我的5分钟任务在凌晨1点45分开始,它花了45分钟来处理,其他本应该在凌晨2点启动的cron无法启动,因为线程在5分钟的任务中很忙。是否有任何设置,其他凌晨2点作业将开始尽快释放线程。帮助我们理解线程在这种情况下的行为。
发布于 2017-10-30 15:07:45
默认情况下,Spring调度器为作业执行提供单线程。您可以将任务执行器配置为具有多个线程和一个队列,以便即使所有线程都很忙,作业也会添加到队列中,并在线程空闲时立即被接收。
下面的示例创建一个简单的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);
}
}https://stackoverflow.com/questions/45104929
复制相似问题