摘要:表示起始時間開始觸發,然后每隔固定時間觸發一次如在域使用則意味著分鐘觸發一次,而,等分別觸發一次表示列出枚舉值值。
文章鏈接:https://liuyueyi.github.io/hexblog/2018/08/01/180801-Spring之定時任務基本使用篇/
Spring之定時任務基本使用篇spring-boot項目中,想添加一個定時任務,可以怎么辦?
不管什么項目,都是可以直接用JDK原生的定時任務來實現
借助@Scheduled注解來使用
本篇博文則主要集中在在SpringBoot項目中,怎么使用定時任務
I. 基本使用 1. demo在SpringBoot項目中,使用定時任務需要先開啟對應的配置,一個簡單的demo如下
@EnableScheduling @SpringBootApplication public class QuickMediaApplication { public static void main(String[] args) { SpringApplication.run(QuickMediaApplication.class, args); } @Scheduled(cron = "0/1 * * * * ?") public void sc1() throws InterruptedException { System.out.println(Thread.currentThread().getName() + " | sc1 " + System.currentTimeMillis()); } }
上面的代碼足夠簡單,基本上沒有什么好額外解釋的,只是注意下要使用定時任務,必須加上 @EnableScheduling注解
2. cron表達式另外一個有意思的就是@Scheduled注解中的cron是怎么定義的,上面那個是啥意思?
Cron定義如下
Seconds Minutes Hours DayofMonth Month DayofWeek Year Seconds Minutes Hours DayofMonth Month DayofWeek
上面每個坑位,可以取得值不一樣,先分別說明幾個可能見到的符號
* : 表示匹配該域的任意值,如分鐘的坑位為*, 表示每分鐘都會觸發
? : 只能用在DayofMonth和DayofWeek兩個域。它也匹配域的任意值,但實際不會。因為DayofMonth和 DayofWeek會相互影響。例如想在每月的20日觸發調度,不管20日到底是星期幾,則只能使用如下寫法: 13 13 15 20 ?
-: 表示范圍,例如在Minutes域使用5-20,表示從5分到20分鐘每分鐘觸發一次。
/: 表示起始時間開始觸發,然后每隔固定時間觸發一次
如在Minutes域使用5/20,則意味著5分鐘觸發一次,而25,45等分別觸發一次
,: 表示列出枚舉值值。
如:在Minutes域使用5,20,則意味著在5和20分每分鐘觸發一次。
L: 表示最后,只能出現在DayofWeek和DayofMonth域,
如在DayofWeek域使用5L,意味著在最后的一個星期四觸發。
W: 表示有效工作日(周一到周五),只能出現在DayofMonth域,系統將在離指定日期的最近的有效工作日觸發事件
如:在 DayofMonth使用5W,如果5日是星期六,則將在最近的工作日:星期五,即4日觸發。如果5日是星期天,則在6日(周一)觸發;如果5日在星期一 到星期五中的一天,則就在5日觸發。另外一點,W的最近尋找不會跨過月份。
LW: 這兩個字符可以連用,表示在某個月最后一個工作日,即最后一個星期五。
#: 用于確定每個月第幾個星期幾,只能出現在DayofMonth域。例如在4#2,表示某月的第二個星期三。
根據上面的說明,前面的crond表達式含義就比較清楚了
0/1 * * * * ? 每s種執行一次3. 實例說明
下面給出一些常見的實例說明
0 0 10,14,16 * * ? 每天上午10點,下午2點,4點 0 0/30 9-17 * * ? 朝九晚五工作時間內每半小時 0 0 12 ? * WED 表示每個星期三中午12點 "0 0 12 * * ?" 每天中午12點觸發 "0 15 10 ? * *" 每天上午10:15觸發 "0 15 10 * * ?" 每天上午10:15觸發 "0 15 10 * * ? *" 每天上午10:15觸發 "0 15 10 * * ? 2005" 2005年的每天上午10:15觸發 "0 * 14 * * ?" 在每天下午2點到下午2:59期間的每1分鐘觸發 "0 0/5 14 * * ?" 在每天下午2點到下午2:55期間的每5分鐘觸發 "0 0/5 14,18 * * ?" 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發 "0 0-5 14 * * ?" 在每天下午2點到下午2:05期間的每1分鐘觸發 "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44觸發 "0 15 10 ? * MON-FRI" 周一至周五的上午10:15觸發 "0 15 10 15 * ?" 每月15日上午10:15觸發 "0 15 10 L * ?" 每月最后一日的上午10:15觸發 "0 15 10 ? * 6L" 每月的最后一個星期五上午10:15觸發 "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一個星期五上午10:15觸發 "0 15 10 ? * 6#3" 每月的第三個星期五上午10:15觸發4. 疑問
上面只是介紹了簡單的使用姿勢,但有幾個自然而然的疑問有待驗證
一個項目中有多個定時任務時,他們是并行執行的還是串行執行的?
如果默認是串行的
那么有相同的crond表達式的定時任務之間,有先后順序么?
某個任務的阻塞是否會影響后面的任務?
如果需要他們并行執行,可以怎么做?
如果是并發執行的
是新創建線程還是采用線程池來復用呢?
在并發執行時,假設有個每秒執行一次的任務,但是它執行一次消耗的時間大于1s時,這個任務的表現時怎樣的呢?不斷地新增線程來執行還是等執行完畢之后再執行下一次的呢?
上面這些問題先跑出來,留待下次結合實例給出回答
II. 其他 1. 一灰灰Blog: https://liuyueyi.github.io/he...一灰灰的個人博客,記錄所有學習和工作中的博文,歡迎大家前去逛逛
2. 聲明盡信書則不如,已上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
微博地址: 小灰灰Blog
QQ: 一灰灰/3302797840
3. 掃描關注一灰灰blog
小灰灰Blog&公眾號
知識星球
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/76571.html
摘要:定時任務高級使用篇前面一篇博文之定時任務基本使用篇介紹了環境下,定時任務的簡單使用姿勢,也留了一些問題,這一篇則希望能針對這些問題給個答案定時任務進階篇問題小結前面一篇博文,拋出了下面的幾個問題,接下來則圍繞問題進行分析一個項目中有多個定時 showImg(https://segmentfault.com/img/remote/1460000015880327); Spring定時任務...
摘要:在定時器接口的方法中我們可以發現一個方法接受接口,而也是一個接口,抽象了觸發任務執行的觸發器。更常用的一個觸發器是,它使用表達式指定何時執行任務。配置定時任務首先看看配置。配置提供了命名空間,讓配置定時任務非常簡單。 本文參考自Spring官方文檔 34. Task Execution and Scheduling。 在程序中常常有定時任務的需求,例如每隔一周生成一次報表、每個月月末清...
摘要:文章鏈接動態腳本支持框架之使用介紹篇動態腳本支持框架之使用介紹篇相關博文動態腳本支持框架整體介紹篇這個項目主要就是為了解決數據訂正和接口驗證不方便的場景,設計的一個及其簡單的動態腳本調度框架,前面一篇整體介紹篇博文,主要介紹了這是 showImg(https://segmentfault.com/img/remote/1460000015698572); 文章鏈接:https://li...
摘要:從使用到原理學習線程池關于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實現在軟件開發中,分散于應用中多出的功能被稱為橫切關注點如事務安全緩存等。 Java 程序媛手把手教你設計模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經風雨慢慢變老,回首走過的點點滴滴,依然清楚的記得當初愛情萌芽的模樣…… Java 進階面試問題列表 -...
閱讀 2402·2021-11-12 10:34
閱讀 1477·2019-08-29 16:15
閱讀 2689·2019-08-29 15:17
閱讀 1348·2019-08-23 17:09
閱讀 395·2019-08-23 11:37
閱讀 2456·2019-08-23 10:39
閱讀 476·2019-08-22 16:43
閱讀 3116·2019-08-22 14:53