Quartz.NET的任務調度,主要就是依靠CronTrigger和Cron表達式。Cron是已經在UNIX存在了很長一段時間,它有着強大和可靠的調度能力。CronTrigger類也正是是基於Cron調度能力。
CronTrigger使用Cron表達式。它能靈活的設置各類計劃任務,好比每週一至週五,早上8點執行某項任務。然而雖然Cron表達式功能強大,靈活,可是也很混亂難懂。因此便在這裏介紹Cron表達式相關的配置。但願你們幫助你們快速理解。
Cron格式
Cron表達式被用來配置CronTrigger實例。Cron表達式是一個由6,7個域(子表達式)和空格組成的字符串。每一個子表達式都描述了一個單獨的日程細節
域 |
是否強制 |
容許值 |
容許特殊字符 |
Seconds |
YES |
0-59 |
, - * / |
Minutes |
YES |
0-59 |
, - * / |
Hours |
YES |
0-23 |
, - * / |
Day of month |
YES |
1-31 |
, - * ? / L W |
Month |
YES |
1-12 or JAN-DEC |
, - * / |
Day of week |
YES |
1-7 or SUN-SAT |
, - * ? / L # |
Year |
NO |
empty, 1970-2099 |
, - * / |
因此,好比一個cron表達式字符串"0 0 10 ? * MON",這表示「每週一的中午10:00」。
上面的列表,能夠清楚的看出,全部的域中的值都有特定的合法範圍,每一個域均可以單獨配置。例如:Day of week(週中的天)必須有值(SUN—SAT)或是使用特殊字符,因此"0 0 10 ? * MON",就能夠改爲爲"MON-FRI", "MON, WED, FRI"甚至是"MON-WED,SAT"。
特殊字符說明
'*' 表示域中「每一個」。好比在"Minutes"域中的*表示每分鐘。
'?' 用在day-of-month及day-of-week域中,表示「沒有指定值」。這對於須要指定一個或者兩個域的值而不須要對其餘域進行設置來講至關有用。例如,我想在一個月的某一天(例如,第十),而不在意具體是哪一天,我會把「10」放在day-of-month 域,而後「?」在day-of-week裏。
'-' 指定範圍,例如,「10-12」在Hours域,表示10點到12點。
',' 指定附加值,例如,「MON,WED,FRI」在day-of-week域中,表示「星期一,星期三和星期五」。
'/' 沒有具體的值,用來用於指定值的增量,例如, 若是在Seconds域中,'0/15',它表示「從0開始,每隔15秒」。
'L' 只用在day-of-month及day-of-week中,這個字符是"last"的簡寫,可是在兩個域中的意義不一樣。例如,在day-of-month域中的"L"表示本月的最後一天,即,一月的31日,非閏年的二月的28日。若是它用在day-of-week中,則表示"7"或者"SAT"。可是,這個字符跟在別的值後面,則表示"當月的最後的周XXX"。例如:"6L" 或者 "FRIL"都表示本月的最後一個週五。同時,也能夠用來指定第某個月的最後一天的倒數第幾天,如「L-3」表示某月最後一天的倒數第三天。注意:當使用'L'選項時,最重要的是不要指定列表或者值範圍,不然會致使混亂。
'W' 用於day-of-week域中指定給定日(星期一星期五)最近的一天。例如:"15W",則表示「距離月中15號最近的工做日是周幾」。
'#' 表示本月中的第幾個周幾。例如:day-of-week域中的"6#3" 或者 "FRI#3"表示「本月中第三個週五」。
相關實例
表達式 |
含義 |
0 0 12 * * ? |
天天中午12點 |
0 15 10 ? * * |
天天上午10點15 |
0 15 10 * * ? |
天天上午10點15 |
0 15 10 * * ? * |
天天上午10點15 |
0 * 14 * * ? |
天天下午2點到2點59的每分鐘 |
0 0/5 14 * * ? |
天天下午2點到2點59的每5分鐘 |
0 0/5 14,18 * * ? |
天天下午2點到2點59和6點到6點55的每5分鐘 |
0 0-5 14 * * ? |
天天下午2點到2點05的每分鐘 |
0 10,44 14 ? 3 WED |
3月份每週三下午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 L-2 * ? |
每月最後一天的倒數次日的上午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 |
0 0 12 1/5 * ? |
每個月的第一天開始,每5天的中午12點 |
0 11 11 11 11 ? |
每一年的11月11日11點11分 |
注意:'?' and '*' 在 day-of-week和day-of-month的影響
參考連接:http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html