2017-07-14 74 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); 
    } 
}