springboot-@schedule任務阻塞問題解決方案


/**
 * 解決@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測試下,上面是解決方案,注冊一個線程池給調度的任務用即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM