定時(shí)任務(wù)注解@Scheduled不生效問(wèn)題及解決
定時(shí)任務(wù)注解@Scheduled不生效
問(wèn)題描述
在用@Scheduled做定時(shí)任務(wù)的注解時(shí),發(fā)現(xiàn)@Scheduled注解不生效。
原因分析
用能要交給spring容器的注解
比如@Component注解。
使用@EnableScheduling
啟動(dòng)類里面/使用定時(shí)任務(wù)所在的類中使用@EnableScheduling 注解開(kāi)啟功能,自動(dòng)掃描
cron表達(dá)式寫(xiě)法不對(duì)
正常寫(xiě)法:@Scheduled(cron="*/10 * * * * ?")
代表10s執(zhí)行一次,每個(gè)對(duì)應(yīng)的是秒 分 時(shí) 天
如果是想每天0:30執(zhí)行一次,那就是:
正常寫(xiě)法:@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é)束后才開(kāi)始cron表達(dá)式時(shí)間匹配
注意:同步任務(wù)所在類必須被spring掃描所管理才行,所以需要添加@Component注解。
很多人明明在方法在添加了@Scheduled注解,但是不生效都是這個(gè)原因,定時(shí)任務(wù)所在類沒(méi)有被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í)行來(lái)說(shuō),定時(shí)任務(wù)方法頭部增加@Async即可實(shí)現(xiàn)并發(fā)執(zhí)行,也就是嚴(yán)格按照cron表達(dá)式進(jìn)行時(shí)間匹配執(zhí)行,無(wú)需等待上一次任務(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ù)線程池的長(zhǎng)度設(shè)置為大于定時(shí)任務(wù)個(gè)數(shù)的值。然后ThreadPoolTaskScheduler默認(rèn)長(zhǎng)度為1。所以默認(rèn)只有一個(gè)定時(shí)任務(wù)在跑。
源碼如下:
所以,需要將ThreadPoolTaskScheduler的長(zhǎng)度修改即可,在項(xiàng)目啟動(dòng)時(shí),設(shè)置長(zhǎng)度,替換原本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)文章
SpringSecurity HttpSecurity 類處理流程分析
SpringSecurity在SSM項(xiàng)目中使用基于配置文件,通過(guò)XML標(biāo)簽定義認(rèn)證信息,HttpSecurity在SpringBoot中通過(guò)代碼配置實(shí)現(xiàn)與XML相同功能,詳細(xì)介紹了HttpSecurity的類結(jié)構(gòu)、處理過(guò)程及其與SecurityBuilder的關(guān)系,感興趣的朋友一起看看吧2024-09-09整理總結(jié)Java多線程程序編寫(xiě)的要點(diǎn)
這篇文章主要介紹了Java多線程程序編寫(xiě)的要點(diǎn),包括線程的狀態(tài)控制和優(yōu)先級(jí)以及線程的通信問(wèn)題等方面,非常之全面!需要的朋友可以參考下2016-01-01使用Java進(jìn)行FreeMarker的web模板開(kāi)發(fā)的基礎(chǔ)教程
這篇文章主要介紹了使用Java進(jìn)行FreeMarker模板引擎開(kāi)發(fā)的基礎(chǔ)教程,文中針對(duì)FreeMarker的網(wǎng)頁(yè)標(biāo)簽用法給出了一些例子,需要的朋友可以參考下2016-03-03Java運(yùn)用SWT插件編寫(xiě)桌面記事本應(yīng)用程序
這篇文章主要為大家介紹了一個(gè)Java項(xiàng)目實(shí)戰(zhàn),一步步教你實(shí)現(xiàn)記事本,步驟很詳細(xì),運(yùn)用SWT插件手把手編寫(xiě)記事本,感興趣的小伙伴們可以參考一下2016-01-01SpringBoot調(diào)用第三方接口的幾種方式小結(jié)
在項(xiàng)目中調(diào)用第三方接口時(shí),確實(shí)需要根據(jù)項(xiàng)目的技術(shù)棧、架構(gòu)規(guī)范以及具體的業(yè)務(wù)需求來(lái)選擇最適合的調(diào)用方式,下面我們就介紹幾種調(diào)用第三方接口的實(shí)現(xiàn)方式以及代碼示例,需要的朋友可以參考下2024-07-07Java中使用數(shù)組實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)實(shí)例
這篇文章主要介紹了Java中使用數(shù)組實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)實(shí)例,本文先是講解了實(shí)現(xiàn)棧至少應(yīng)該包括以下幾個(gè)方法等知識(shí),然后給出代碼實(shí)例,需要的朋友可以參考下2015-01-01