定時(shí)任務(wù)注解@Scheduled不生效問題及解決
定時(shí)任務(wù)注解@Scheduled不生效
問題描述
在用@Scheduled做定時(shí)任務(wù)的注解時(shí),發(fā)現(xiàn)@Scheduled注解不生效。
原因分析
用能要交給spring容器的注解
比如@Component注解。
使用@EnableScheduling
啟動(dòng)類里面/使用定時(shí)任務(wù)所在的類中使用@EnableScheduling 注解開啟功能,自動(dòng)掃描
cron表達(dá)式寫法不對(duì)
正常寫法:@Scheduled(cron="*/10 * * * * ?")
代表10s執(zhí)行一次,每個(gè)對(duì)應(yīng)的是秒 分 時(shí) 天
如果是想每天0:30執(zhí)行一次,那就是:
正常寫法:@Scheduled(cron=“0 30 0 * * ?”)
使用apollo添加配置后,apollo修改配置后不生效
在使用@Scheduled時(shí),項(xiàng)目啟動(dòng)時(shí)已將時(shí)間注入Spring容器中。
相當(dāng)于就算是apollo改了內(nèi)容有熱加載機(jī)制,值也不會(huì)生效。
如果想生效,需要重啟服務(wù)。
@Scheduled實(shí)現(xiàn)定時(shí)任務(wù)(實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)并發(fā)執(zhí)行)
@Scheduled實(shí)現(xiàn)定時(shí)任務(wù)
使用@Scheduled注解需要springboot啟動(dòng)類上添加注解@EnableScheduling
@SpringBootApplication
@MapperScan(basePackages = {"com.xxx.*.mapper"})
@EnableScheduling
public class PictureProcessingAdminApplication{
public static void main(String[] args) {
SpringApplication.run(PictureProcessingAdminApplication.class, args);
}
}同個(gè)任務(wù)的同步執(zhí)行
同步執(zhí)行:等待上一次定時(shí)任務(wù)結(jié)束后才開始cron表達(dá)式時(shí)間匹配
注意:同步任務(wù)所在類必須被spring掃描所管理才行,所以需要添加@Component注解。
很多人明明在方法在添加了@Scheduled注解,但是不生效都是這個(gè)原因,定時(shí)任務(wù)所在類沒有被spring管理。
@Component
public class taskTest {
@Scheduled(cron = "0 */1 * * * ?")
public void task1(){
try {
System.out.println("任務(wù)1執(zhí)行:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis())));
Thread.sleep(65000);
System.out.println("任務(wù)1結(jié)束:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis())));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}同個(gè)任務(wù)的并發(fā)執(zhí)行
相對(duì)同步執(zhí)行來說,定時(shí)任務(wù)方法頭部增加@Async即可實(shí)現(xiàn)并發(fā)執(zhí)行,也就是嚴(yán)格按照cron表達(dá)式進(jìn)行時(shí)間匹配執(zhí)行,無需等待上一次任務(wù)執(zhí)行結(jié)束。
@Component
public class taskTest {
@Async
@Scheduled(cron = "0 */1 * * * ?")
public void task1(){
try {
System.out.println("任務(wù)1執(zhí)行:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis())));
Thread.sleep(65000);
System.out.println("任務(wù)1結(jié)束:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis())));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}多個(gè)任務(wù)的同步執(zhí)行
任務(wù)使用@Scheduled
然后最重要的是,需要將springboot維護(hù)的ThreadPoolTaskScheduler定時(shí)任務(wù)線程池的長度設(shè)置為大于定時(shí)任務(wù)個(gè)數(shù)的值。然后ThreadPoolTaskScheduler默認(rèn)長度為1。所以默認(rèn)只有一個(gè)定時(shí)任務(wù)在跑。
源碼如下:



所以,需要將ThreadPoolTaskScheduler的長度修改即可,在項(xiàng)目啟動(dòng)時(shí),設(shè)置長度,替換原本springboot管理的bean即可。
@Component
public class TaskSchedulerConfig {
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(10);
return threadPoolTaskScheduler;
}
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring中使用Async進(jìn)行異步功能開發(fā)實(shí)戰(zhàn)示例(大文件上傳為例)
本文以大文件上傳為例,首先講解在未進(jìn)行程序異步化時(shí),程序的運(yùn)行機(jī)制和具體表現(xiàn),然后講解如何進(jìn)行異步化的改造,讓程序進(jìn)行異步執(zhí)行,通過本文不僅能讓你掌握如何進(jìn)行Event的事件開發(fā),同時(shí)還能掌握在Spring中如何進(jìn)行異步開發(fā),熟悉@Async的具體用法,感興趣的朋友一起看看吧2024-08-08
詳解java CountDownLatch和CyclicBarrier在內(nèi)部實(shí)現(xiàn)和場景上的區(qū)別
這篇文章主要介紹了詳解java CountDownLatch和CyclicBarrier在內(nèi)部實(shí)現(xiàn)和場景上的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
json如何解析混合數(shù)組對(duì)象到實(shí)體類的list集合里去
這篇文章主要介紹了json解析混合數(shù)組對(duì)象到實(shí)體類的list集合里去的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
mybatis一對(duì)多兩種mapper寫法實(shí)例
這篇文章主要介紹了mybatis一對(duì)多兩種mapper寫法實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Spring Cloud中關(guān)于Feign的常見問題總結(jié)
這篇文章主要給大家介紹了Spring Cloud中關(guān)于Feign的常見問題,文中通過示例代碼介紹的很詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-02-02
MybatisPlus修改時(shí)空字段無法修改的解決方案
這篇文章主要介紹了MybatisPlus修改時(shí)空字段無法修改的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
JDK17前后寫法超詳細(xì)對(duì)比(差點(diǎn)沒認(rèn)出是Java)
在實(shí)際應(yīng)用中,開發(fā)人員可以根據(jù)項(xiàng)目需求選擇合適的JDK版本,例如,對(duì)于需要高運(yùn)行效率和低延遲的應(yīng)用,可以選擇最新版本的JDK,以便獲得更好的性能和特性支持,這篇文章主要介紹了JDK17前后寫法超詳細(xì)對(duì)比的相關(guān)資料,需要的朋友可以參考下2026-04-04
Spring中ApplicationEvent事件機(jī)制源碼詳解
這篇文章主要介紹了Spring中ApplicationEvent事件機(jī)制源碼詳解,Spring中與事件有關(guān)的接口和類主要包括ApplicationEvent、ApplicationListener,下面來看一下Spring中事件的具體應(yīng)用,需要的朋友可以參考下2023-09-09

