解決多個@Scheduled定時任務(wù)執(zhí)行時個別不執(zhí)行問題
多個@Scheduled定時任務(wù)執(zhí)行時個別不執(zhí)行
原因
項目在啟動時,如果沒有指定線程池的大小,默認會創(chuàng)建核心線程數(shù)為1的默認線程池,故而當項目中出現(xiàn)多個@Scheduled線程時,只能一個個的執(zhí)行,從而導致個別線程執(zhí)行時間過長(或長期執(zhí)行)時,其他定時器不能按照指定的規(guī)則進行執(zhí)行。
解決辦法
1、配置執(zhí)行線程池的大小
spring.task.scheduling.pool.size=10
2.將定時器設(shè)置為異步線程
/** 異步線程 定時器延遲1秒啟動,每距上一次執(zhí)行完成后間隔3秒執(zhí)行一次 */ @Async(“taskExecutor”) @Scheduled(initialDelay = 1000L, fixedDelay = 3000L) public void test(){System.out.println(“—”+System.currentTimeMillis());//業(yè)務(wù)內(nèi)容 }
@Scheduled多定時任務(wù),重疊執(zhí)行
@Scheduled如果有兩個定時任務(wù),定時任務(wù)重復時,只有一個可以執(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("當前時間:"+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("當前時間:"+LocalDateTime.now()+" 任務(wù)execute2對應(yīng)的線程名: "+curName); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
通過執(zhí)行可以看到,打印線程名稱為同一個。即如果不手動指定線程池,則默認啟動單線程,進行執(zhí)行定時任務(wù)。
如果想要多個定時任務(wù)重疊執(zhí)行,需要手動指定線程池,如下
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("當前時間:"+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("當前時間:"+LocalDateTime.now()+" 任務(wù)execute2對應(yīng)的線程名: "+curName); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
此時,多個定時任務(wù),是不通的線程執(zhí)行,同時,定時任務(wù)可以重疊執(zhí)行。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中SQLAlchemy使用前端頁面實現(xiàn)插入數(shù)據(jù)
這篇文章主要介紹了SQLAlchemy使用前端頁面實現(xiàn)插入數(shù)據(jù),文章內(nèi)容介紹詳細巨頭有一定的參考價值,需要的小伙伴可以參考一下2022-03-03Python Flask異步發(fā)送郵件實現(xiàn)方法解析
這篇文章主要介紹了Python Flask異步發(fā)送郵件實現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08對網(wǎng)站內(nèi)嵌gradio應(yīng)用的輸入輸出做審核實現(xiàn)詳解
這篇文章主要為大家介紹了對網(wǎng)站內(nèi)嵌gradio應(yīng)用的輸入輸出做審核實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04