Spring @Scheduled的坑及解決
Spring @Scheduled的坑
spring的定時(shí)任務(wù)有兩個(gè)坑
1.單線程執(zhí)行,多個(gè)定時(shí)任務(wù)不能同時(shí)執(zhí)行
2.如果當(dāng)前定時(shí)任務(wù)還沒(méi)有結(jié)束,那么下一次定時(shí)任務(wù)的時(shí)間到了也不會(huì)觸發(fā)。
解決辦法
加上@EnableAsync注解
@Scheduled 定時(shí)任務(wù)不執(zhí)行
排查代碼中添加的定時(shí)任務(wù)步驟是否正確
- 啟動(dòng)類上加 @EnableScheduling 注解
- 定時(shí)任務(wù)類上加@Component
- 定時(shí)方法上加@Scheduled
@Scheduled(cron = "0 19 16 * * ?") public void cron() { log.info("定時(shí)任務(wù)開啟:---"); }
排查是否任務(wù)阻塞,如果定時(shí)任務(wù)出現(xiàn)異常阻塞后,將不會(huì)在次執(zhí)行
解決:進(jìn)行try…catch異常拋出
java中多個(gè)@Scheduled定時(shí)器不執(zhí)行
原因是:
@Scheduled注解會(huì)在默認(rèn)情況下以單線程的方式執(zhí)行定時(shí)任務(wù)。
這個(gè)“單線程”指兩個(gè)方面:
- 如果一個(gè)定時(shí)任務(wù)執(zhí)行時(shí)間大于其任務(wù)間隔時(shí)間,那么下一次將會(huì)等待上一次執(zhí)行結(jié)束后再繼續(xù)執(zhí)行。
- 如果多個(gè)定時(shí)任務(wù)在同一時(shí)刻執(zhí)行,任務(wù)會(huì)依次執(zhí)行。
為了讓@Scheduled效率更高,我們可以通過(guò)兩種方法將定時(shí)任務(wù)變成多線程執(zhí)行:
方法1、在啟動(dòng)類中配置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 // 對(duì)某個(gè)方法進(jìn)行異步執(zhí)行 @Scheduled(initialDelay = 1,fixedDelay=10000)//initialDelay 在容器啟動(dòng)后,延遲1毫秒再執(zhí)行一次定時(shí)器 public void aa() { //執(zhí)行業(yè)務(wù)邏輯 } @Async @Scheduled(initialDelay = 1,fixedDelay=10000)//fixedDelay 以上一次方法執(zhí)行完開始算起,如上一次方法執(zhí)行阻塞住了,那么直到上一次執(zhí)行完,并間隔給定的時(shí)間后,執(zhí)行下一次 public void bb() { //執(zhí)行業(yè)務(wù)邏輯 }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何調(diào)用chatGPT實(shí)現(xiàn)代碼機(jī)器人
最近c(diǎn)hatGPT也是非常的火爆,相信大家都看到了,現(xiàn)在提供一種Java調(diào)用chatGPT的方法,我們主要通過(guò)兩個(gè)工具來(lái)實(shí)現(xiàn),一就是httpclient,二就是hutool,你覺(jué)得那種好理解你就用那種即可,今天通過(guò)本文給大家分享調(diào)用chatGPT實(shí)現(xiàn)代碼機(jī)器人,感興趣的朋友一起看看吧2022-12-12java 中動(dòng)態(tài)代理(JDK,cglib)實(shí)例代碼
這篇文章主要介紹了java 中動(dòng)態(tài)代理,這里介紹了JDK 動(dòng)態(tài)代理與 cglib 動(dòng)態(tài)代理的相關(guān)資料2017-04-04Spring Boot中RabbitMQ自動(dòng)配置的介紹、原理和使用方法
本文介紹了Spring Boot中RabbitMQ自動(dòng)配置的介紹、原理和使用方法,通過(guò)本文的介紹,我們希望讀者能夠更好地理解Spring Boot中RabbitMQ的使用方法,并在項(xiàng)目中更加靈活地應(yīng)用,感興趣的朋友跟隨小編一起看看吧2023-07-07