2017-07-14 87 views
0

我有2个方法定期运行与春季调度,一个是@Scheduled(fixedRate = 300000) - 每5分钟和 其他是@Scheduled(cron =“0 0 0 2 * *? ) - 每天凌晨2点我们没有使用taskScheduler和线程池,所以它只使用一个线程 所以没有重叠Spring @Scheduler重叠

我观察到的是,当5分钟工作需要更多时间(比如> 30分钟)假设我的5分钟工作是在凌晨1点45分开始的,并且需要45分钟才能完成,假设在凌晨2点开始的其他cron由于线程在5分钟工作中忙碌而无法启动。有任何设置,其他凌晨2点的工作将在线程发布后立即开始。帮助我们了解线程的行为这种情况。

回答

2

默认情况下,Spring调度程序为作业执行提供单个线程。您可以使用多于1个线程和队列来配置任务执行程序,以便即使所有线程都处于繁忙状态,作业也会被添加到队列中,并且只要线程空闲,就可以立即执行。

以下示例创建一个简单的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); 
    } 
}