在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ Spring @Scheduled 定時(shí)任務(wù),若任務(wù)過長(zhǎng),導(dǎo)致重疊怎么辦?

Spring @Scheduled 定時(shí)任務(wù),若任務(wù)過長(zhǎng),導(dǎo)致重疊怎么辦?

譬如定時(shí)任務(wù)fixedRate是5秒,但是有時(shí)候任務(wù)執(zhí)行超過5秒,接下來該任務(wù)的下一次執(zhí)行怎么辦?

或者cron是每分鐘第5秒開始做一次任務(wù),但是該任務(wù)超過1分鐘,該任務(wù)的下一次執(zhí)行怎么辦?

假設(shè)在有定時(shí)線程池的情況下,會(huì)不會(huì)從線程池中取另一個(gè)線程來執(zhí)行該任務(wù)的下一次執(zhí)行,使得該任務(wù)的兩次執(zhí)行能并發(fā)進(jìn)行?

其實(shí)這個(gè)問題從另一個(gè)角度來看,我們知道開啟兩個(gè)任務(wù)A和B可以有兩種方式,一是放在同一個(gè)類里

       @Component
       Class Tasks{
           @Scheduled(cron="5 */1 * * * ?")
           public void ATask(){
              ...
           }
           
           @Scheduled(cron="5 */1 * * * ?")
           public void BTask(){
              ...
           }
       }
       

一種是放在兩個(gè)不同類中

       @Component
       Class ATask{
           @Scheduled(cron="5 */1 * * * ?")
           public void Task(){
              ...
           }        
       }
       

       @Component
       Class BTask{
           @Scheduled(cron="5 */1 * * * ?")
           public void Task(){
              ...
           }        
       }

若有定時(shí)線程池,那么這A和B兩個(gè)任務(wù)都可以并發(fā)進(jìn)行吧?但是同一個(gè)任務(wù)的兩次執(zhí)行在時(shí)間上發(fā)生重疊的話,可以并法執(zhí)行嗎?

回答
編輯回答
久礙你

不想重疊,分布式鎖了解一下,Redis/hazelcast等,遇到了并發(fā)的,就直接跳過不執(zhí)行后續(xù)的業(yè)務(wù)邏輯。

2018年8月1日 04:01
編輯回答
裸橙

出現(xiàn)你說的這種問題,應(yīng)該說是程序規(guī)劃不合理,不管spring schedule采用哪種策略,都不能解決你的問題: 疊加新的任務(wù)線程,會(huì)造成任務(wù)堆積進(jìn)而雪崩;或跳過后來的任務(wù),造成漏執(zhí)行,所以要看你自己的業(yè)務(wù)能接受哪種情況,合理規(guī)劃間隔時(shí)間和超時(shí)時(shí)間.

初始化 SchedulerFactoryBean 下面參數(shù)與此有關(guān):

PROP_THREAD_COUNT: 線程數(shù), 設(shè)置這個(gè)參數(shù),疊加也不會(huì)超過這個(gè)參數(shù).

如果采用的是quartz定時(shí)任務(wù)的實(shí)現(xiàn), 默認(rèn)情況下并沒有timeout機(jī)制, 可以采用
類似方式自己實(shí)現(xiàn)定時(shí)任務(wù)的超時(shí).

2017年5月31日 19:25