SpringBoot通過@Scheduled實現(xiàn)定時任務(wù)及單線程運行問題解決
一、開啟定時任務(wù)方法
Scheduled定時任務(wù)是Spring boot自身提供的功能,所以不需要引入Maven依賴包
在項目入口main方法上加注解
@EnableScheduling //開啟定時任務(wù)
二、不同定時方式的解析
1.fixedDelay和fixedRate,單位是毫秒,它們的區(qū)別就是:
fixedRate就是每隔多長時間執(zhí)行一次。(開始------->X時間------>再開始)。如果間隔時間小于任務(wù)執(zhí)行時間,上一次任務(wù)執(zhí)行完成下一次任務(wù)就立即執(zhí)行。如果間隔時間大于任務(wù)執(zhí)行時間,就按照每隔X時間運行一次。
而fixedDelay是當任務(wù)執(zhí)行完畢后一段時間再次執(zhí)行。(開始—>結(jié)束(隔一分鐘)開始----->結(jié)束)。上一次執(zhí)行任務(wù)未完成,下一次任務(wù)不會開始。
2.cron表達式:靈活
舉例說明
表達式 | 說明 |
---|---|
0 0 3 * * ? | 每天3點執(zhí)行 |
0 5 3 * * ? | 每天3點5分執(zhí)行 |
0 5 3 ? * * | 每天3點5分執(zhí)行,與上面作用相同 |
0 5/10 3 * * ? | 每天3點的 5分,15分,25分,35分,45分,55分這幾個時間點執(zhí)行 |
0 10 3 ? * 1 | 每周星期天,3點10分 執(zhí)行,注:1表示星期天 |
0 10 3 ? * 1#3 | 每個月的第三個星期,星期天 執(zhí)行,#號只能出現(xiàn)在星期的位置 |
- 第一位,表示秒,取值0-59
- 第二位,表示分,取值0-59
- 第三位,表示小時,取值0-23
- 第四位,日期天/日,取值1-31
- 第五位,日期月份,取值1-12
- 第六位,星期,取值1-7,星期一,星期二…,注:不是第1周,第二周的意思,另外:1表示星期天,2表示星期一。
- 第七位,年份,可以留空,取值1970-2099
cron中,還有一些特殊的符號,含義如下:
- ()星號:可以理解為每的意思,每秒,每分,每天,每月,每年…
- (?)問號:問號只能出現(xiàn)在日期和星期這兩個位置。
- (-)減號:表達一個范圍,如在小時字段中使用“10-12”,則表示從10到12點,即10,11,12
- (,)逗號:表達一個列表值,如在星期字段中使用“1,2,4”,則表示星期一,星期二,星期四
- (/)斜杠:如:x/y,x是開始值,y是步長,比如在第一位(秒) 0/15就是,從0秒開始,每15秒,最后就是0,15,30,45,60 另:/y,等同于0/y
cron表達式在線:http://tools.jb51.net/code/Quartz_Cron_create
三、實現(xiàn)定時任務(wù)
@Component public class ScheduledJobs { //表示方法執(zhí)行完成后5秒再開始執(zhí)行 @Scheduled(fixedDelay=5000) public void fixedDelayJob() throws InterruptedException{ System.out.println("fixedDelay 開始:" + new Date()); Thread.sleep(10 * 1000); System.out.println("fixedDelay 結(jié)束:" + new Date()); } //表示每隔3秒 @Scheduled(fixedRate=3000) public void fixedRateJob()throws InterruptedException{ System.out.println("===========fixedRate 開始:" + new Date()); Thread.sleep(5 * 1000); System.out.println("===========fixedRate 結(jié)束:" + new Date()); } //表示每隔10秒執(zhí)行一次 @Scheduled(cron="0/10 * * * * ? ") public void cronJob(){ System.out.println("=========================== ...>>cron...." + new Date()); } }
運行結(jié)果如下:從運行結(jié)果上看,并未按照預期的時間規(guī)律運行。仔細看線程打印,竟然所有的定時任務(wù)使用的都是一個線程,所以彼此互相影響。
===========fixedRate 結(jié)束:Tue Jul 09 19:53:04 CST 2019pool-1-thread-1
fixedDelay 開始:Tue Jul 09 19:53:04 CST 2019pool-1-thread-1
fixedDelay 結(jié)束:Tue Jul 09 19:53:14 CST 2019pool-1-thread-1
===========fixedRate 開始:Tue Jul 09 19:53:14 CST 2019pool-1-thread-1
===========fixedRate 結(jié)束:Tue Jul 09 19:53:16 CST 2019pool-1-thread-1
===========fixedRate 開始:Tue Jul 09 19:53:16 CST 2019pool-1-thread-1
===========fixedRate 結(jié)束:Tue Jul 09 19:53:18 CST 2019pool-1-thread-1
=========================== ...>>cron....Tue Jul 09 19:53:18 CST 2019pool-1-thread-1
===========fixedRate 開始:Tue Jul 09 19:53:18 CST 2019pool-1-thread-1
===========fixedRate 結(jié)束:Tue Jul 09 19:53:20 CST 2019pool-1-thread-1
===========fixedRate 開始:Tue Jul 09 19:53:20 CST 2019pool-1-thread-1
===========fixedRate 結(jié)束:Tue Jul 09 19:53:22 CST 2019pool-1-thread-1
===========fixedRate 開始:Tue Jul 09 19:53:22 CST 2019pool-1-thread-1
===========fixedRate 結(jié)束:Tue Jul 09 19:53:24 CST 2019pool-1-thread-1
fixedDelay 開始:Tue Jul 09 19:53:24 CST 2019pool-1-thread-1
fixedDelay 結(jié)束:Tue Jul 09 19:53:34 CST 2019pool-1-thread-1
=========================== ...>>cron....Tue Jul 09 19:53:34 CST 2019pool-1-thread-1
===========fixedRate 開始:Tue Jul 09 19:53:34 CST 2019pool-1-thread-1
===========fixedRate 結(jié)束:Tue Jul 09 19:53:36 CST 2019pool-1-thread-1
===========fixedRate 開始:Tue Jul 09 19:53:36 CST 2019pool-1-thread-1
===========fixedRate 結(jié)束:Tue Jul 09 19:53:38 CST 2019pool-1-thread-1
===========fixedRate 開始:Tue Jul 09 19:53:38 CST 2019pool-1-thread-1
===========fixedRate 結(jié)束:Tue Jul 09 19:53:40 CST 2019pool-1-thread-1
===========fixedRate 開始:Tue Jul 09 19:53:40 CST 2019pool-1-thread-1
===========fixedRate 結(jié)束:Tue Jul 09 19:53:42 CST 2019pool-1-thread-1
===========fixedRate 開始:Tue Jul 09 19:53:42 CST 2019pool-1-thread-1
===========fixedRate 結(jié)束:Tue Jul 09 19:53:44 CST 2019pool-1-thread-1
===========fixedRate 開始:Tue Jul 09 19:53:44 CST 2019pool-1-thread-1
===========fixedRate 結(jié)束:Tue Jul 09 19:53:46 CST 2019pool-1-thread-1
===========fixedRate 開始:Tue Jul 09 19:53:46 CST 2019pool-1-thread-1
===========fixedRate 結(jié)束:Tue Jul 09 19:53:48 CST 2019pool-1-thread-1
fixedDelay 開始:Tue Jul 09 19:53:48 CST 2019pool-1-thread-1
fixedDelay 結(jié)束:Tue Jul 09 19:53:58 CST 2019pool-1-thread-1
=========================== ...>>cron....Tue Jul 09 19:53:58 CST 2019pool-1-thread-1
四、解決定時任務(wù)單線程運行的問題
@Configuration @EnableScheduling public class ScheduleConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(scheduledTaskExecutor()); } @Bean public Executor scheduledTaskExecutor() { return Executors.newScheduledThreadPool(3); //指定線程池大小 } }
再次運行上面的程序,運行時間規(guī)律就符合期望了。
總結(jié)
到此這篇關(guān)于SpringBoot通過@Scheduled實現(xiàn)定時任務(wù)及單線程運行問題解決的文章就介紹到這了,更多相關(guān)SpringBoot @Scheduled實現(xiàn)定時任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot中定時任務(wù)@Scheduled的多線程使用詳解
- SpringBoot?ScheduledTaskRegistrar解決動態(tài)定時任務(wù)思路詳解
- SpringBoot定時任務(wù)動態(tài)擴展ScheduledTaskRegistrar詳解
- SpringBoot中定時任務(wù)@Scheduled注解的使用解讀
- 解決SpringBoot中的Scheduled單線程執(zhí)行問題
- SpringBoot中使用@scheduled定時執(zhí)行任務(wù)的坑
- springboot使用定時器@Scheduled不管用的解決
- 帶你3分鐘帶你搞定Spring Boot中Schedule
相關(guān)文章
使用Apache Ignite實現(xiàn)Java數(shù)據(jù)網(wǎng)格
今天我們來探討如何使用Apache Ignite來實現(xiàn)Java數(shù)據(jù)網(wǎng)格,Apache Ignite是一個高性能的內(nèi)存計算平臺,它提供了分布式緩存、數(shù)據(jù)網(wǎng)格和計算功能,可以顯著提高大規(guī)模應用的數(shù)據(jù)處理性能,感興趣的小伙伴跟著小編一起來看看吧2024-08-08Flowable?設(shè)置任務(wù)處理人的四種方式詳解
這篇文章主要為大家介紹了Flowable?設(shè)置任務(wù)處理人的四種方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10關(guān)于spring依賴注入的方式以及優(yōu)缺點
這篇文章主要介紹了關(guān)于spring依賴注入的方式以及優(yōu)缺點,依賴注入,是IOC的一個方面,是個通常的概念,它有多種解釋,這概念是說你不用創(chuàng)建對象,而只需要描述它如何被創(chuàng)建,需要的朋友可以參考下2023-07-07基于Java堆內(nèi)存的10個要點的總結(jié)分析
本篇文章是對Java堆內(nèi)存的10個要點進行了詳細的分析介紹,需要的朋友參考下2013-05-05