解決多個(gè)@Scheduled定時(shí)任務(wù)執(zhí)行時(shí)個(gè)別不執(zhí)行問題
多個(gè)@Scheduled定時(shí)任務(wù)執(zhí)行時(shí)個(gè)別不執(zhí)行
原因
項(xiàng)目在啟動(dòng)時(shí),如果沒有指定線程池的大小,默認(rèn)會(huì)創(chuàng)建核心線程數(shù)為1的默認(rèn)線程池,故而當(dāng)項(xiàng)目中出現(xiàn)多個(gè)@Scheduled線程時(shí),只能一個(gè)個(gè)的執(zhí)行,從而導(dǎo)致個(gè)別線程執(zhí)行時(shí)間過長(或長期執(zhí)行)時(shí),其他定時(shí)器不能按照指定的規(guī)則進(jìn)行執(zhí)行。
解決辦法
1、配置執(zhí)行線程池的大小
spring.task.scheduling.pool.size=10
2.將定時(shí)器設(shè)置為異步線程
/** 異步線程 定時(shí)器延遲1秒啟動(dòng),每距上一次執(zhí)行完成后間隔3秒執(zhí)行一次 */ @Async(“taskExecutor”) @Scheduled(initialDelay = 1000L, fixedDelay = 3000L) public void test(){System.out.println(“—”+System.currentTimeMillis());//業(yè)務(wù)內(nèi)容 }
@Scheduled多定時(shí)任務(wù),重疊執(zhí)行
@Scheduled如果有兩個(gè)定時(shí)任務(wù),定時(shí)任務(wù)重復(fù)時(shí),只有一個(gè)可以執(zhí)行。如下
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @Component public class MyScheduled { @Scheduled(cron = "0/5 * * * * ?") public void execute1(){ String curName = Thread.currentThread().getName() ; System.out.println("當(dāng)前時(shí)間:"+LocalDateTime.now()+" 任務(wù)execute1對應(yīng)的線程名: "+curName); try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } } @Scheduled(cron = "0/5 * * * * ?") public void execute2(){ String curName = Thread.currentThread().getName() ; System.out.println("當(dāng)前時(shí)間:"+LocalDateTime.now()+" 任務(wù)execute2對應(yīng)的線程名: "+curName); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
通過執(zhí)行可以看到,打印線程名稱為同一個(gè)。即如果不手動(dòng)指定線程池,則默認(rèn)啟動(dòng)單線程,進(jìn)行執(zhí)行定時(shí)任務(wù)。
如果想要多個(gè)定時(shí)任務(wù)重疊執(zhí)行,需要手動(dòng)指定線程池,如下
import org.springframework.context.annotation.Bean; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @Component @EnableScheduling public class MyScheduled { @Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.setPoolSize(50); return taskScheduler; } @Scheduled(cron = "0/5 * * * * ?") public void execute1(){ String curName = Thread.currentThread().getName() ; System.out.println("當(dāng)前時(shí)間:"+LocalDateTime.now()+" 任務(wù)execute1對應(yīng)的線程名: "+curName); try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } } @Scheduled(cron = "0/5 * * * * ?") public void execute2(){ String curName = Thread.currentThread().getName() ; System.out.println("當(dāng)前時(shí)間:"+LocalDateTime.now()+" 任務(wù)execute2對應(yīng)的線程名: "+curName); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
此時(shí),多個(gè)定時(shí)任務(wù),是不通的線程執(zhí)行,同時(shí),定時(shí)任務(wù)可以重疊執(zhí)行。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中SQLAlchemy使用前端頁面實(shí)現(xiàn)插入數(shù)據(jù)
這篇文章主要介紹了SQLAlchemy使用前端頁面實(shí)現(xiàn)插入數(shù)據(jù),文章內(nèi)容介紹詳細(xì)巨頭有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-03-03Selenium 安裝和簡單使用的實(shí)現(xiàn)
這篇文章主要介紹了Selenium 安裝和簡單使用的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12解決python刪除文件的權(quán)限錯(cuò)誤問題
下面小編就為大家分享一篇解決python刪除文件的權(quán)限錯(cuò)誤問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Python Flask異步發(fā)送郵件實(shí)現(xiàn)方法解析
這篇文章主要介紹了Python Flask異步發(fā)送郵件實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08對網(wǎng)站內(nèi)嵌gradio應(yīng)用的輸入輸出做審核實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了對網(wǎng)站內(nèi)嵌gradio應(yīng)用的輸入輸出做審核實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04