鍍金池/ 問(wèn)答/Java  網(wǎng)絡(luò)安全/ springboot Scheduled相關(guān)問(wèn)題~

springboot Scheduled相關(guān)問(wèn)題~

現(xiàn)在有個(gè)定時(shí)任務(wù)在項(xiàng)目里面,是每天凌晨執(zhí)行一次,但是有一天數(shù)據(jù)量特別大,任務(wù)跑了一天還沒(méi)跑完,一直執(zhí)行到了第二天,然后這個(gè)任務(wù)又開(kāi)始執(zhí)行了。所以造成了數(shù)據(jù)的重復(fù)

相關(guān)代碼

    /***
     * 每天凌晨一點(diǎn)sqlserver數(shù)據(jù)庫(kù)抓取數(shù)據(jù)
     * @throws Exception 系統(tǒng)異常
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void switchDate(){}

這么寫(xiě)的,現(xiàn)在我想讓任務(wù)執(zhí)行的時(shí)候看上一次同一任務(wù)執(zhí)行完沒(méi),如果沒(méi)有執(zhí)行完就推遲任務(wù)執(zhí)行時(shí)間。我查過(guò)資料就是類(lèi)似 Quartzconcurrent 屬性,是這么說(shuō)的:

其中 concurrent 屬性標(biāo)識(shí)的解釋為:對(duì)于相同的 JobDetail ,當(dāng)指定多個(gè) Trigger 時(shí), 很可能第一個(gè)job 完成之前,第二個(gè) job 就開(kāi)始了。指定 concurrent 設(shè)為 false,多個(gè) job 不會(huì)并發(fā)運(yùn)行,第二個(gè)job 將不會(huì)在第一個(gè) job 完成之前開(kāi)始。

那么此處的第二個(gè) job 到底是被推遲執(zhí)行了,還是被取消了呢? 今天帶著這個(gè)疑問(wèn)做了一個(gè)小實(shí)驗(yàn),具體做法如下:將任務(wù)的 Trigger 設(shè)置為每 10 秒鐘執(zhí)行一次,然后在執(zhí)行的任務(wù)體內(nèi)讓 Thread 暫停 15 秒鐘,這樣不同的 job 之間肯定會(huì)有時(shí)間上的重疊。當(dāng)啟動(dòng)程序之后,發(fā)現(xiàn)前一個(gè) job 執(zhí)行結(jié)束的時(shí)刻的秒數(shù)為15,而且第二個(gè)本來(lái)在 10s 就執(zhí)行的 job 馬上就啟動(dòng)了。

由此可見(jiàn),concurrent屬性實(shí)際是將job推遲執(zhí)行了。

各位有誰(shuí)知道嗎?小弟表述不清的地方...對(duì)不住了( ?? ω ?? )y

回答
編輯回答
忠妾

spring默認(rèn)使用的是單線(xiàn)程executor,應(yīng)該不會(huì)有第一個(gè)沒(méi)執(zhí)行完就執(zhí)行第二個(gè)這種情況發(fā)生?;蛘吣憧梢哉蟩uartz: https://docs.spring.io/spring...

2018年1月10日 00:41