Scheduled
只適合處理簡單的計劃任務,不能處理分布式計劃任務。優勢:是spring框架提供的計劃任務,開發簡單,執行效率比較高。且在計劃任務數量太多的時候,可能出現阻塞,崩潰,延遲啟動等問題。
Scheduled定時任務是spring3.0版本之後自帶的一個定時任務。其所屬Spring的資源包為:spring-context-support。所以需要使用Scheduled定時任務機制時,需要在工程中依賴對應資源,具體如下:
如果在spring應用中需要啟用Scheduled定時任務,則需要在啟動類上增加註解@EnableScheduling,代表啟用Scheduled定時任務機制。具體如下:
Scheduled定時任務的核心在於註解@Scheduled,這個註解的核心屬性是cron,代表定時任務的觸發計劃表達式。這個表達式的格式為:
@Scheduled(cron="seconds minutes hours day month week")或
@Scheduled(cron="seconds minutes hours day month week year")
推薦使用第一種表達式形式,因為在很多其他技術中都有不同的定時任務機制,其中用於設置觸發計劃的表達式都是第一種cron表達式。第二種表達式不能說是Spring Scheduled特有的,也是只有少數技術支持的。
cron表達式中,每個位置的約束如下:
星號(*):可用在所有欄位中,表示對應時間域的每一個時刻,例如,*在分鐘欄位時,表示「每分鐘」;
問號(?):該字符只在日期和星期欄位中使用,它通常指定為「無意義的值」,相當於佔位符;
減號(-):表達一個範圍,如在小時欄位中使用「10-12」,則表示從10到12點,即10,11,12;
逗號(,):表達一個列表值,如在星期欄位中使用「MON,WED,FRI」,則表示星期一,星期三和星期五;
斜槓(/):x/y表達一個等步長序列,x為起始值,y為增量步長值。如在秒數欄位中使用0/15,則表示為0,15,30和45秒,而5/15在分鐘欄位中表示5,20,35,50,你也可以使用*/y,它等同於0/y;
L:該字符只在日期和星期欄位中使用,代表「Last」的意思,但它在兩個欄位中意思不同。L在日期欄位中,表示這個月份的最後一天,如一月的31號,非閏年二月的28號;如果L用在星期中,則表示星期六,等同於7。但是,如果L出現在星期欄位裡,而且在前面有一個數值X,則表示「這個月的最後X天」,例如,6L表示該月的最後星期五;
W:該字符只能出現在日期欄位裡,是對前導日期的修飾,表示離該日期最近的工作日。例如15W表示離該月15號最近的工作日,如果該月15號是星期六,則匹配14號星期五;如果15日是星期日,則匹配16號星期一;如果15號是星期二,那結果就是15號星期二。但必須注意關聯的匹配日期不能夠跨月,如你指定1W,如果1號是星期六,結果匹配的是3號星期一,而非上個月最後的那天。W字符串只能指定單一日期,而不能指定日期範圍;
LW組合:在日期欄位可以組合使用LW,它的意思是當月的最後一個工作日;
井號(#):該字符只能在星期欄位中使用,表示當月某個工作日。如6#3表示當月的第三個星期五(6表示星期五,#3表示當前的第三個),而4#5表示當月的第五個星期三,假設當月沒有第五個星期三,忽略不觸發;
C:該字符只在日期和星期欄位中使用,代表「Calendar」的意思。它的意思是計劃所關聯的日期,如果日期沒有被關聯,則相當於日曆中所有日期。例如5C在日期欄位中就相當於日曆5日以後的第一天。1C在星期欄位中相當於星期日後的第一天。
Cron表達式對特殊字符的大小寫不敏感,對代表星期的縮寫英文大小寫也不敏感。
計劃任務Scheduled是通過一個線程池實現的。是一個多線程的調度。SpringBoot會初始化一個線程池,線程池默認大小為1,專門用於執行計劃任務。每個計劃任務啟動的時候,都從線程池中獲取一個線程執行,如果發生異常,只是執行當前任務的線程發生異常,而不是計劃任務調度線程發生異常。如果當前定時任務還未執行完成,當相同的定時任務又進入到執行周期時,不會觸發新的定時任務。如:
如結果所示(每次的線程名稱一致,由於前一個定時任務未執行完成,因此造成後一個任務的推遲,而不是1秒執行一次,而是3秒):
quartz
Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,它可以與J2EE與J2SE應用程式相結合也可以單獨使用。Quartz可以用來創建簡單或為運行十個,百個,甚至是好幾萬個Jobs這樣複雜的程序。
Quartz是一個完全由java編寫的開源作業調度框架。不要讓作業調度這個術語嚇著你。儘管Quartz框架整合了許多額外功能, 但就其簡易形式看,你會發現它易用得簡直讓人受不了!
在開發Quartz相關應用時,只要定義了Job(任務),Trigger(觸發器)和Scheduler(調度器),即可實現一個定時調度能力。其中Scheduler是Quartz中的核心,Scheduler負責管理Quartz應用運行時環境,Scheduler不是靠自己完成所有的工作,是根據Trigger的觸發標準,調用Job中的任務執行邏輯,來完成完整的定時任務調度。
Job - 定時任務內容是什麼。Trigger - 在什麼時間上執行job。Scheduler - 維護定時任務環境,並讓觸發器生效。
在SpringBoot中應用Quartz,需要依賴下述資源:
啟動器添加註解@EnableScheduling:
定義JOB任務以及JOB任務調用的模擬業務對象:
創建Trigger以及JobDetail對象,並用Schedule配置定時任務:
重寫JobFactory:
分布式quartz配置
1、資源依賴配置:由於分布式的原因,Quartz中提供分布式處理的jar包以及資料庫及連接相關的依賴。
2、提供資料庫相關配置:
3、提供Quartz配置信息,為Quartz提供資料庫配置信息,如資料庫,表格的前綴之類的。
4、初始化資料庫
建表語句可以自己在官方網站中查找(Quartz-lib中),使用tables-mysql.sql建表。
5、定義JOB類
啟動器和普通quartz無差異,但是JOB自身定義有些許差異:
6、QuartzConfiguration類型定義