Spring定時(shí)任務(wù)注解@Scheduled執(zhí)行計(jì)劃異常問題

后端系統(tǒng)經(jīng)常會(huì)遇到定時(shí)執(zhí)行某個(gè)任務(wù)的需求,如果這個(gè)任務(wù)只是后端的一個(gè)方法,沒有太過復(fù)雜的關(guān)聯(lián)邏輯,那么我們只需要配合Spring框架提的供定時(shí)任務(wù)注解@Scheduled再加上一個(gè)Cron表達(dá)式便可輕輕松松滿足需求,沒錯(cuò),實(shí)現(xiàn)就是這么簡(jiǎn)單。

但是功能到生產(chǎn)環(huán)境以后發(fā)現(xiàn)一個(gè)問題,定時(shí)任務(wù)并沒有按照我們預(yù)定的執(zhí)行計(jì)劃執(zhí)行,經(jīng)常會(huì)漏執(zhí)行,很奇怪,這是為神馬?

給所有定時(shí)任務(wù)加日志,發(fā)現(xiàn)一個(gè)規(guī)律,如果程序里面有多個(gè)定時(shí)任務(wù),則每一個(gè)定時(shí)任務(wù)的日志是串行打印的,并沒有想象中的并行打印,也就是這些定時(shí)任務(wù)同時(shí)只有一個(gè)線程在執(zhí)行。google一下資料,果然,Spring默認(rèn)給所有定時(shí)任務(wù)只分配了一個(gè)線程,這樣的話如果我們有很多定時(shí)任務(wù)或者一個(gè)定時(shí)任務(wù)執(zhí)行很久,就會(huì)造成其他定時(shí)任務(wù)阻塞中,無法按照cron執(zhí)行的情況。

解決辦法就是程序里面用了多少定時(shí)任務(wù)注解@Scheduled,就初始化多少線程,這樣各個(gè)定時(shí)任務(wù)就不會(huì)互相影響了。

代碼如下:

@Configuration
//定時(shí)任務(wù)調(diào)用一個(gè)線程池中的線程。
public class ScheduleConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        //參數(shù)傳入一個(gè)size為10的線程池
        scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
    }
}

另外還需要注意一個(gè)問題,就是單個(gè)定時(shí)任務(wù)最好保證在指定的執(zhí)行計(jì)劃內(nèi)執(zhí)行完畢,否則依然會(huì)出現(xiàn)該定時(shí)任務(wù)跳過當(dāng)次執(zhí)行的問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容