後端系統常常會遇到定時執行某個任務的需求,若是這個任務只是後端的一個方法,沒有太過複雜的關聯邏輯,那麼咱們只須要配合Spring框架提的供定時任務註解@Scheduled再加上一個Cron表達式即可輕輕鬆鬆知足需求,沒錯,實現就是這麼簡單。後端
可是功能到生產環境之後發現一個問題,定時任務並無按照咱們預約的執行計劃執行,常常會漏執行,很奇怪,這是爲神馬?bash
給全部定時任務加日誌,發現一個規律,若是程序裏面有多個定時任務,則每個定時任務的日誌是串行打印的,並無想象中的並行打印,也就是這些定時任務同時只有一個線程在執行。google一下資料,果真,Spring默認給全部定時任務只分配了一個線程,這樣的話若是咱們有不少定時任務或者一個定時任務執行好久,就會形成其餘定時任務阻塞中,沒法按照cron執行的狀況。框架
解決辦法就是程序裏面用了多少定時任務註解@Scheduled,就初始化多少線程,這樣各個定時任務就不會互相影響了。ide
代碼以下:google
@Configuration
//定時任務調用一個線程池中的線程。
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
//參數傳入一個size爲10的線程池
scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
}
}
複製代碼
另外還須要注意一個問題,就是單個定時任務最好保證在指定的執行計劃內執行完畢,不然依然會出現該定時任務跳過當次執行的問題。spa