/** * 解決@Schedule任務單線程阻塞問題 * 線程池不允許使用Executors創建,要通過ThreadPoolExecutor的方式 * 說明:Executors返回的線程池對象的弊端如下: * 1)FixedThreadPool和SingleThreadPool: * 允許的請求隊列長度為Integer.MAX_VALUE,可能會堆積大量的請求,從而導致OOM。 * 2)CachedThreadPool: * 允許的創建線程數量為Integer.MAX_VALUE,可能會創建大量的線程,從而導致OOM。 */ @Configuration public class ScheduleConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(10, new BasicThreadFactory.Builder().namingPattern("customized-schedule-pool-%d").daemon(true).build()); taskRegistrar.setScheduler(executorService); } }
先貼代碼
這個問題很容易發生,尤其是當一個項目里的定時任務比較多的時候,會出現"排隊"現象,導致本來定義好的觸發時間點,任務沒有fire執行
如果看schedule的源碼可以知道,所有的@Schedule的任務都會加入到一個單線程中去執行,這樣的話上一個任務沒有執行完的話,后面添加的任務就會排隊等待
可以自行sout測試下,上面是解決方案,注冊一個線程池給調度的任務用即可