Spring @Scheduled的坑及解決
Spring @Scheduled的坑
spring的定時任務(wù)有兩個坑
1.單線程執(zhí)行,多個定時任務(wù)不能同時執(zhí)行
2.如果當(dāng)前定時任務(wù)還沒有結(jié)束,那么下一次定時任務(wù)的時間到了也不會觸發(fā)。
解決辦法
加上@EnableAsync注解
@Scheduled 定時任務(wù)不執(zhí)行
排查代碼中添加的定時任務(wù)步驟是否正確
- 啟動類上加 @EnableScheduling 注解
- 定時任務(wù)類上加@Component
- 定時方法上加@Scheduled
@Scheduled(cron = "0 19 16 * * ?")
public void cron() {
log.info("定時任務(wù)開啟:---");
}排查是否任務(wù)阻塞,如果定時任務(wù)出現(xiàn)異常阻塞后,將不會在次執(zhí)行
解決:進行try…catch異常拋出
java中多個@Scheduled定時器不執(zhí)行
原因是:
@Scheduled注解會在默認(rèn)情況下以單線程的方式執(zhí)行定時任務(wù)。
這個“單線程”指兩個方面:
- 如果一個定時任務(wù)執(zhí)行時間大于其任務(wù)間隔時間,那么下一次將會等待上一次執(zhí)行結(jié)束后再繼續(xù)執(zhí)行。
- 如果多個定時任務(wù)在同一時刻執(zhí)行,任務(wù)會依次執(zhí)行。
為了讓@Scheduled效率更高,我們可以通過兩種方法將定時任務(wù)變成多線程執(zhí)行:
方法1、在啟動類中配置TaskScheduler線程池大?。?/strong>
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10);//不配置默認(rèn)是1
return taskScheduler;
}方法2、利用Spring提供的@Async注解和@EnableAsync注解
@Component
@EnableAsync //開啟異步支持
public class TimedTask{
@Async // 對某個方法進行異步執(zhí)行
@Scheduled(initialDelay = 1,fixedDelay=10000)//initialDelay 在容器啟動后,延遲1毫秒再執(zhí)行一次定時器
public void aa() {
//執(zhí)行業(yè)務(wù)邏輯
}
@Async
@Scheduled(initialDelay = 1,fixedDelay=10000)//fixedDelay 以上一次方法執(zhí)行完開始算起,如上一次方法執(zhí)行阻塞住了,那么直到上一次執(zhí)行完,并間隔給定的時間后,執(zhí)行下一次
public void bb() {
//執(zhí)行業(yè)務(wù)邏輯
}總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java實現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴的方法
這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴的表達(dá)式方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11
關(guān)于Java跨域Json字符轉(zhuǎn)類對象的方法示例
這篇文章主要給大家介紹了關(guān)于Java跨域Json字符轉(zhuǎn)類對象的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
Spring Boot 數(shù)據(jù)緩存與性能優(yōu)化實戰(zhàn)指南
本文主要介紹了SpringBoot數(shù)據(jù)緩存與性能優(yōu)化的相關(guān)內(nèi)容,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2026-04-04
Spring Boot 2.0 設(shè)置網(wǎng)站默認(rèn)首頁的實現(xiàn)代碼
這篇文章主要介紹了Spring Boot 2.0 設(shè)置網(wǎng)站默認(rèn)首頁的實現(xiàn)代碼,需要的朋友可以參考下2018-04-04
Mybatis-plus一對多分頁數(shù)據(jù)條數(shù)不正確的處理
這篇文章主要介紹了Mybatis-plus一對多分頁數(shù)據(jù)條數(shù)不正確的處理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的區(qū)
這篇文章主要介紹了com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的區(qū)別以及設(shè)定serverTimezone的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09

