Quartz.NET配置

Quartz.NET 是一個開源的做業調度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#寫成,可用於winform和asp.net應用中。它提供了巨大的靈活性而不犧牲簡單性。你可以用它來爲執行一個做業而建立簡單的或複雜的調度。它有不少特徵,如:數據庫支持,集羣,插件,支持cron-like表達式等等。html

首先看一下簡單的quartz_jobs.xml示例數據庫

複製代碼
quartz_jobs.xml
 <?xml version="1.0" encoding="UTF-8"?> <!-- This file contains job definitions in schema version 2.0 format --> <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> <processing-directives> <overwrite-existing-data>true</overwrite-existing-data> </processing-directives> <schedule> <job> <name>sampleJob</name> <group>sampleGroup</group> <description>Sample job for Quartz Server</description> <job-type>Quartz.Server.SampleJob, Quartz.Server</job-type> <durable>true</durable> <recover>false</recover> </job> <trigger> <simple> <name>sampleSimpleTrigger</name> <group>sampleSimpleGroup</group> <description>Simple trigger to simply fire sample job</description> <job-name>sampleJob</job-name> <job-group>sampleGroup</job-group> <misfire-instruction>SmartPolicy</misfire-instruction> <repeat-count>-1</repeat-count> <repeat-interval>10000</repeat-interval> </simple> </trigger> <job> <name>CommissionJob</name> <group>CommissionJob</group> <description>Sample job for Quartz Server</description> <job-type>Settlement.Jobs.CommissionJob, Settlement.Jobs</job-type> <durable>true</durable> <recover>false</recover> </job> <trigger> <cron> <name>sampleSimpleTrigger2</name> <group>sampleSimpleTrigger2</group> <job-name>sampleJob2</job-name> <job-group>sampleGroup2</job-group> <cron-expression>0/10 * * * * ?</cron-expression> </cron> </trigger> </schedule> </job-scheduling-data>
複製代碼

 

 

job-scheduling-data 爲跟節點再也不解釋express

processing-directives這個節點官方給的示例中就存在,幹啥用的沒有深刻了解,保持默認配置便可框架

schedule任務調度集合能夠配置多個但貌似只有第一個的配置起做用,如何讓多個schedule同時起做用但願知道的童鞋告訴下,不勝感激。全部的job和trigger均放在這個節點下面asp.net

job 任務,其實就是1.x版本中的<job-detail>,這個節點是用來定義每一個具體的任務的,多個任務請建立多個job節點便可spa

  • name(必填) 任務名稱,同一個group中多個job的name不能相同,若未設置group則全部未設置group的job爲同一個分組,如:<name>sampleJob</name>
  • group(選填) 任務所屬分組,用於標識任務所屬分組,如:<group>sampleGroup</group>
  • description(選填) 任務描述,用於描述任務具體內容,如:<description>Sample job for Quartz Server</description>
  • job-type(必填) 任務類型,任務的具體類型及所屬程序集,格式:實現了IJob接口的包含完整命名空間的類名,程序集名稱,如:<job-type>Quartz.Server.SampleJob, Quartz.Server</job-type>
  • durable(選填) 具體做用不知,官方示例中默認爲true,如:<durable>true</durable>
  • recover(選填) 具體做用不知,官方示例中默認爲false,如:<recover>false</recover>


    trigger 任務觸發器,用於定義使用何種方式出發任務(job),同一個job能夠定義多個trigger ,多個trigger 各自獨立的執行調度,每一個trigger 中必須且只能定義一種觸發器類型(calendar-interval、simple、cron)
    .net

    calendar-interval 一種觸發器類型,使用較少,此處略過插件

    simple 簡單任務的觸發器,能夠調度用於重複執行的任務orm

    • name(必填) 觸發器名稱,同一個分組中的名稱必須不一樣
    • group(選填) 觸發器組
    • description(選填) 觸發器描述
    • job-name(必填) 要調度的任務名稱,該job-name必須和對應job節點中的name徹底相同
    • job-group(選填) 調度任務(job)所屬分組,該值必須和job中的group徹底相同
    • start-time(選填) 任務開始執行時間utc時間,北京時間須要+08:00,如:<start-time>2012-04-01T08:00:00+08:00</start-time>表示北京時間2012年4月1日上午8:00開始執行,注意服務啓動或重啓時都會檢測此屬性,若沒有設置此屬性或者start-time設置的時間比當前時間較早,則服務啓動後會當即執行一次調度,若設置的時間比當前時間晚,服務會等到設置時間相同後纔會第一次執行任務,通常若無特殊須要請不要設置此屬性
    • repeat-count(必填)  任務執行次數,如:<repeat-count>-1</repeat-count>表示無限次執行,<repeat-count>10</repeat-count>表示執行10次
    • repeat-interval(必填) 任務觸發間隔(毫秒),如:<repeat-interval>10000</repeat-interval> 每10秒執行一次

    cron複雜任務觸發器--使用cron表達式定製任務調度(強烈推薦)xml

    • name(必填) 觸發器名稱,同一個分組中的名稱必須不一樣
    • group(選填) 觸發器組
    • description(選填) 觸發器描述
    • job-name(必填) 要調度的任務名稱,該job-name必須和對應job節點中的name徹底相同
    • job-group(選填) 調度任務(job)所屬分組,該值必須和job中的group徹底相同
    • start-time(選填) 任務開始執行時間utc時間,北京時間須要+08:00,如:<start-time>2012-04-01T08:00:00+08:00</start-time>表示北京時間2012年4月1日上午8:00開始執行,注意服務啓動或重啓時都會檢測此屬性,若沒有設置此屬性,服務會根據cron-expression的設置執行任務調度;若start-time設置的時間比當前時間較早,則服務啓動後會忽略掉cron-expression設置,當即執行一次調度,以後再根據cron-expression執行任務調度;若設置的時間比當前時間晚,則服務會在到達設置時間相同後纔會應用cron-expression,根據規則執行任務調度,通常若無特殊須要請不要設置此屬性
    • cron-expression(必填) cron表達式,如:<cron-expression>0/10 * * * * ?</cron-expression>每10秒執行一次

    瞭解了Quartz.NET 2.0的quartz_jobs.xml配置後就能夠在項目中引用Quartz.dll文件而後實現IJob接口,根據實際項目中的須要靈活配置quartz_jobs,不須要再進行額外的開發,實現靈活的多任務調度,須要注意的是修改了quartz_jobs.xml文件後,quartz服務默認不會從新加載該文件,若要讓修改後的文件生效須要重啓下服務才行,另外start-time屬性請必定慎用,若實在須要能夠在使用完成後當即刪除掉該屬性不然可能形成很嚴重的後果(親身經歷血的教訓,呵呵)

 

Quartz的cron表達式
按順序依次爲 
秒(0~59) 
分鐘(0~59) 
小時(0~23) 
天(月)(0~31,可是你須要考慮你月的天數)
月(0~11) 
天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT) 
7.年份(1970-2099) 

其中每一個元素能夠是一個值(如6),一個連續區間(9-12),一個間隔時間(8-18/4)(/表示每隔4小時),一個列表(1,3,5),通配符。因爲"月份中的日期"和"星期中的日期"這兩個元素互斥的,必需要對其中一個設置?. 
0 0 10,14,16 * * ? 天天上午10點,下午2點,4點 
0 0/30 9-17 * * ?   朝九晚五工做時間內每半小時 
0 0 12 ? * WED 表示每一個星期三中午12點 
有些子表達式能包含一些範圍或列表 
例如:子表達式(天(星期))能夠爲 「MON-FRI」,「MON,WED,FRI」,「MON-WED,SAT」 
「*」字符表明全部可能的值 
所以,「*」在子表達式(月)裏表示每月的含義,「*」在子表達式(天(星期))表示星期的每一天 

「/」字符用來指定數值的增量 
例如:在子表達式(分鐘)裏的「0/15」表示從第0分鐘開始,每15分鐘 
         在子表達式(分鐘)裏的「3/20」表示從第3分鐘開始,每20分鐘(它和「3,23,43」)的含義同樣 

「?」字符僅被用於天(月)和天(星期)兩個子表達式,表示不指定值 
當2個子表達式其中之一被指定了值之後,爲了不衝突,須要將另外一個子表達式的值設爲「?」 

「L」 字符僅被用於天(月)和天(星期)兩個子表達式,它是單詞「last」的縮寫 
可是它在兩個子表達式裏的含義是不一樣的。 
在天(月)子表達式中,「L」表示一個月的最後一天 
在天(星期)自表達式中,「L」表示一個星期的最後一天,也就是SAT 
若是在「L」前有具體的內容,它就具備其餘的含義了 
例如:「6L」表示這個月的倒數第6天,「FRIL」表示這個月的最一個星期五 
注意:在使用「L」參數時,不要指定列表或範圍,由於這會致使問題 



附:cronExpression配置說明 

字段 容許值 容許的特殊字符 
秒 0-59 , - * / 
分 0-59 , - * / 
小時 0-23 , - * / 
日期 1-31 , - * ? / L W C 
月份 1-12 或者 JAN-DEC , - * / 
星期 1-7 或者 SUN-SAT , - * ? / L C # 
年(可選) 留空, 1970-2099 , - * / 
表達式 意義 
"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觸發 
特殊字符 意義 
* 表示全部值; 
? 表示未說明的值,即不關心它爲什麼值; 
- 表示一個指定的範圍; 
, 表示附加一個可能值; 
/ 符號前表示開始時間,符號後表示每次遞增的值; 
L("last") ("last") "L" 用在day-of-month字段意思是 "這個月最後一天";用在 day-of-week字段, 它簡單意思是 "7" or "SAT"。 若是在day-of-week字段裏和數字聯合使用,它的意思就是 "這個月的最後一個星期幾" – 例如: "6L" means "這個月的最後一個星期五". 當咱們用「L」時,不指明一個列表值或者範圍是很重要的,否則的話,咱們會獲得一些意想不到的結果。 
W("weekday") 只能用在day-of-month字段。用來描敘最接近指定天的工做日(週一到週五)。例如:在day-of-month字段用「15W」指「最接近這個 月第15天的工做日」,即若是這個月第15天是週六,那麼觸發器將會在這個月第14天即週五觸發;若是這個月第15天是週日,那麼觸發器將會在這個月第 16天即週一觸發;若是這個月第15天是週二,那麼就在觸發器這天觸發。注意一點:這個用法只會在當前月計算值,不會越過當前月。「W」字符僅能在 day-of-month指明一天,不能是一個範圍或列表。也能夠用「LW」來指定這個月的最後一個工做日。 
# 只能用在day-of-week字段。用來指定這個月的第幾個周幾。例:在day-of-week字段用"6#3"指這個月第3個週五(6指週五,3指第3個)。若是指定的日期不存在,觸發器就不會觸發。 
C 指和calendar聯繫後計算過的值。例:在day-of-month 字段用「5C」指在這個月第5天或以後包括calendar的第一天;在day-of-week字段用「1C」指在這週日或以後包括calendar的第一天。

 

Cron表達式被用來配置CronTrigger實例。Cron表達式是一個由7個子表達式組成的字符串。每一個子表達式都描述了一個單獨的日程細節。這些子表達式用空格分隔,分別表示:

1. Seconds 秒

2. Minutes 分鐘

3. Hours 小時

4. Day-of-Month 月中的天

5. Month 月

6. Day-of-Week 週中的天

7. Year (optional field) 年(可選的域)

一個cron表達式的例子字符串爲"0 0 12 ? * WED",這表示「每週三的中午12:00」。

單個子表達式能夠包含範圍或者列表。例如:前面例子中的週中的天這個域(這裏是"WED")能夠被替換爲"MON-FRI", "MON, WED, FRI"或者甚至"MON-WED,SAT"。

通配符('*')能夠被用來表示域中「每一個」可能的值。所以在"Month"域中的*表示每月,而在Day-Of-Week域中的*則表示「週中的每一天」。

全部的域中的值都有特定的合法範圍,這些值的合法範圍至關明顯,例如:秒和分域的合法值爲0到59,小時的合法範圍是0到23,Day-of-Month中值得合法凡範圍是0到31,可是須要注意不一樣的月份中的天數不一樣。月份的合法值是0到11。或者用字符串JAN,FEB MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV 及DEC來表示。Days-of-Week能夠用1到7來表示(1=星期日)或者用字符串SUN, MON, TUE, WED, THU, FRI 和SAT來表示.

'/'字符用來表示值的增量,例如, 若是分鐘域中放入'0/15',它表示「每隔15分鐘,從0開始」,若是在分鐘域中使用'3/20',則表示「小時中每隔20分鐘,從第3分鐘開始」或者另外相同的形式就是'3,23,43'。

'?'字符能夠用在day-of-month及day-of-week域中,它用來表示「沒有指定值」。這對於須要指定一個或者兩個域的值而不須要對其餘域進行設置來講至關有用。

'L' 字符能夠在day-of-month及day-of-week中使用,這個字符是"last"的簡寫,可是在兩個域中的意義不一樣。例如,在day-of- month域中的"L"表示這個月的最後一天,即,一月的31日,非閏年的二月的28日。若是它用在day-of-week中,則表示"7"或者"SAT"。可是若是在day-of-week域中,這個字符跟在別的值後面,則表示"當月的最後的周XXX"。例如:"6L" 或者 "FRIL"都表示本月的最後一個週五。當使用'L'選項時,最重要的是不要指定列表或者值範圍,不然會致使混亂。

'W' 字符用來指定距離給定日最接近的周幾(在day-of-week域中指定)。例如:若是你爲day-of-month域指定爲"15W",則表示「距離月中15號最近的周幾」。

'#'表示表示月中的第幾個周幾。例如:day-of-week域中的"6#3" 或者 "FRI#3"表示「月中第三個週五」。

做爲一個例子,下面的Quartz.NET克隆表達式將在星期一到星期五的天天上午10點15分執行一個做業。

0 15 10 ? * MON-FRI

下面的表達式

0 15 10 ? * 6L 2007-2010

將在2007年到2010年的每月的最後一個星期五上午10點15分執行做業。你不可能用SimpleTrigger來作這些事情。你能夠用二者之中的任何一個,但哪一個跟合適則取決於你的調度須要。

相關文章
相關標籤/搜索