quartz開源任務排程框架知識總結(一)
1.1.1 JDK Timer & TimerTask
如果是執行簡單的有一定執行週期的,那麼使用jdk自帶的timer是最簡單的。具體:
①、編寫一個簡單類繼承 TimerTask,在這個新編寫的類中重寫父類中run方法,在run中執行要執行的操作;
②、編寫一個簡單類,在類中寫一個方法,方法體中使用timer呼叫在①中建立的類並設定好timer執行週期。
package cn.chenny.nsfw.complain; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimerTask; public class MyTask extends TimerTask { //執行的任務 @Override public void run() { SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); System.out.println("do timerTask !!time:"+format.format(new Date())); } }
package cn.chenny.nsfw.complain;
import java.util.Timer;
public class App {
public static void main(String args[]){
Timer timer = new Timer();
//延遲1秒,以2s為週期執行以下任務
timer.schedule(new MyTask(), 1000, 2000);
}
}
1.1.2 Spring 整合Quartz
在使用jdk的timer時發現無法滿足這次的開發需求;即無法在指定的日期進行執行任務。這便引入一個優秀的開源任務排程框架“quartz”。Quart的官網:
在spring中整合Quartz 進行任務排程;首先將需要用到的jar包引入專案的lib目錄下:
“spring-context-support-3.2.4.RELEASE.jar” 此包是spring根據quartz中的主要類進行再次封裝成具有bean風格的類;
“quartz-2.2.1.jar” quartz的核心包
要在spring 中利用quartz排程任務;需要配置三個bean:
1、 jobDetail 任務詳細資訊;包括呼叫哪個類;類中的哪個方法;執行時是否可並行執行任務。
2、 trigger 任務排程觸發器;主要用於定義jobDetail什麼時候執行。觸發器最常用的有兩種:簡單觸發器SimpleTrigger 和任務觸發器CronTrigger 。SimpleTrigger和jdk的timer類似,只能指定任務執行以什麼樣的頻率執行,但無法制定精確的執行時間。CronTrigger則既可以執行簡單觸發器所制定的以頻率來執行的時間,也可以制定複雜的時間計劃來執行。如可制定:每個月的最後一天的15點來執行相關任務。下圖是以3秒來執行相關任務
CronTrigger中的 cronExpression 表示式屬性中接收的內容:
在表示式中時間格式間用空格隔開,每個時間表示:秒分鐘 小時 日 月 周 年(可選填)
可出現的值和符合:
'*' 字元可以用於所有欄位,在“分”欄位中設為"*"表示"每一分鐘"的含義。
'?' 字元可以用在“日”和“周幾”欄位. 它用來指定 '不明確的值'. 這在你需要指定這兩個欄位中的某一個值而不是另外一個的時候會被用到。在後面的例子中可以看到其含義。
'-' 字元被用來指定一個值的範圍,比如在“小時”欄位中設為"10-12"表示"10點到12點".
',' 字元指定數個值。比如在“周幾”欄位中設為"MON,WED,FRI"表示"thedays Monday, Wednesday, and Friday".
'/' 字元用來指定一個值的的增加幅度. 比如在“秒”欄位中設定為"0/15"表示"第0, 15, 30, 和 45秒"。而"5/15"則表示"第5, 20, 35, 和 50". 在'/'前加"*"字元相當於指定從0秒開始. 每個欄位都有一系列可以開始或結束的數值。對於“秒”和“分”欄位來說,其數值範圍為0到59,對於“小時”欄位來說其為0到23, 對於“日”欄位來說為0到31, 而對於“月”欄位來說為1到12。"/"欄位僅僅只是幫助你在允許的數值範圍內從開始"第n"的值。因此對於“月”欄位來說"7/6"只是表示7月被開啟而不是“每六個月”, 請注意其中微妙的差別。
'L'字元可用在“日”和“周幾”這兩個欄位。它是"last"的縮寫, 但是在這兩個欄位中有不同的含義。例如,“日”欄位中的"L"表示"一個月中的最後一天" ——對於一月就是31號對於二月來說就是28號(非閏年)。而在“周幾”欄位中, 它簡單的表示"7" or "SAT",但是如果在“周幾”欄位中使用時跟在某個數字之後, 它表示"該月最後一個星期×" ——比如"6L"表示"該月最後一個週五"。當使用'L'選項時,指定確定的列表或者範圍非常重要,否則你會被結果搞糊塗的。
'W' 可用於“日”欄位。用來指定歷給定日期最近的工作日(週一到週五) 。比如你將“日”欄位設為"15W",意為: "離該月15號最近的工作日"。因此如果15號為週六,觸發器會在14號即週五呼叫。如果15號為週日, 觸發器會在16號也就是週一觸發。如果15號為週二,那麼當天就會觸發。然而如果你將“日”欄位設為"1W", 而一號又是週六, 觸發器會於下週一也就是當月的3號觸發,因為它不會越過當月的值的範圍邊界。'W'字元只能用於“日”欄位的值為單獨的一天而不是一系列值的時候。
'L'和'W'可以組合用於“日”欄位表示為'LW',意為"該月最後一個工作日"。
'#' 字元可用於“周幾”欄位。該字元表示“該月第幾個周×”,比如"6#3"表示該月第三個週五( 6表示週五而"#3"該月第三個)。再比如: "2#1" = 表示該月第一個週一而 "4#5" = 該月第五個週三。注意如果你指定"#5"該月沒有第五個“周×”,該月是不會觸發的。
'C' 字元可用於“日”和“周幾”欄位,它是"calendar"的縮寫。它表示為基於相關的日曆所計算出的值(如果有的話)。如果沒有關聯的日曆, 那它等同於包含全部日曆。“日”欄位值為"5C"表示"日曆中的第一天或者5號及其以後",“周幾”欄位值為"1C"則表示"日曆中的第一天或者週日及其以後"。
對於“月份”欄位和“周幾”欄位來說合法的字元都不是大小寫敏感的。
官方文件示例:
3、 schedulerFactory 任務排程工廠;用於排程各個任務觸發器。