Quartz.NET 2.x 文件翻譯 - Lesson 6:CronTrigger觸發模式

龐順龍發表於2019-05-11

Quartz.NET 2.x 文件翻譯 - Lesson 6:CronTrigger觸發模式 檢視官網英文原文

返回目錄

CronTriggers一般情況下比SimpleTrigger更加靈活和方便,如果我們需要按照日曆日期來執行job而非按照固定的時間間隔來執行排程,那麼肯定是CronTriggers更加合適了。

使用CronTrigger,我們可以設定執行時間點為“每星期五中午”,或“每週日上午9:30”,甚至可是是“每星期一星期三和星期五上午9:00點到午10:00每5分鐘執行一次”。 

當然想SimpleTrigger一樣,CronTrigger也有開始執行時間點,排程結束時間點等。

Cron Expressions

Cron表示式被用於配置CronTrigger例項,Cron表示式是一個7個子表示式組成的字串,分別表示不同的排程時間點。這些子表示式之間以空格分割,分別表示:

  1. Seconds 秒
  2. Minutes 分
  3. Hours 時
  4. Day-of-Month 日
  5. Month 月
  6. Day-of-Week 周
  7. Year (optional field) 年
比如說:“0 0 12 ? * WED”這個表示式就是表示“每週三12點”的表示式。

單個子表示式可以包含範圍和/或列表,比如,周欄位可以是“MON-FRI”、“MON, WED, FRI”,甚至“MON-WED,SAT”也可以。

''字元可以用來標示任意值在節點中,比如上面例子Month節點說到的意義,意思就是任何月份,每個月。*字元在Day-Of—Week就表示周的每一天。

所有子節點都可以指定時間點,這些時間點必須是明確可用的,比如對於seconds分鐘來說,我們可以寫0-59這樣的數字,對於hour小時來說,我們寫0-23之間的數字,對於Day-of-Month來說就需要寫0-31之間的數字,當然Day-of-Month的時候需要注意月份到底有多少天。對於Months來說就是0-11之間了,或者我們也可以使用JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV 和 DEC來表示月份,Days-of-Week的話就是1-7之間,當然也是可以使用SUN, MON, TUE, WED, THU, FRI 和 SAT。

/ 字元可以用來指定增量值,比如,如果我們把'0/15'填寫在Minutes節點,意思就是從0分開始,每十五分鐘支援一次,如果我們填寫‘3/20’,意思就是從3分開始,每二十分鐘執行一次,再解釋下就是在一小時內,在3,23,43分鐘的時候會執行。

? 字元允許day-of-month 和 day-of-week 的任一天,主要用於沒有指定數值。當我們需要指定是哪個子節點的時候是有用的,一會看下面的例子來解釋。

L 字元用於限定day-of-month 和 day-of-week,是last的簡寫,在兩個子節點有不同的意義,比如day-of-month中意味著月份的最後一天,比如一月份的31,閏年二月份的28等,在 day-of-week 中意味著一週的最後一天7或者SAT。如果在day-of-week中使用數值+L的方式,這意思是月當中的最後一個數值天,比如6L或者FRIL,就是月中最後一個星期五,需要注意的是,如果我們使用了L引數,就不要在混合集合或者數值區間,這樣會導致指定的日期混亂。

W 字元用於指定星期(星期一到星期五)工作日中最近的一天,比如我們要指定15w,意思就是當前月中最近的第十五個工作日。

# 字元用於指定月當中第幾個工作日,比如day-of-week中設定6#3或者FRI#3,意思就是月當中第三個週五。

Example Cron Expressions

下面我們舉些例子,更多的可以參考api文件查詢

例子1 - 每間隔五分鐘觸發一次
"0 0/5 * * * ?"

例子2 - 每間隔五分鐘的第10秒執行一次
"10 0/5 * * * ?"

例子3 - 每週3,週五的10:30, 11:30, 12:30和13:30執行
"0 30 10-13 ? * WED,FRI"

例子4 - 每月第五天和第二十天的 8:00, 8:30, 9:00 和 9:30執行

"0 0/30 8-9 5,20 * ?"

注意:有時候可能要求執行的排程比較複雜,那麼簡單方案就是我們進行拆分,將複雜的排程拆成多個觸發器,並行即可。

Building CronTriggers

CronTrigger例項使用TriggerBuilder和WithCronSchedule擴充套件方法進行建立。

我們也可以使用CronScheduleBuilder 的靜態方法建立排程。

例子1:每天上午8點到下午5點中,每2分鐘執行一次
trigger = TriggerBuilder.Create()
    .WithIdentity("trigger3", "group1")
    .WithCronSchedule("0 0/2 8-17 * * ?")
    .ForJob("myJob", "group1")
    .Build();
例子2:每天10:42執行
// we use CronScheduleBuilder's static helper methods here
trigger = TriggerBuilder.Create()
    .WithIdentity("trigger3", "group1")
    .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(10, 42))
    .ForJob(myJobKey)
    .Build();
也可以是:
trigger = TriggerBuilder.Create()
    .WithIdentity("trigger3", "group1")
    .WithCronSchedule("0 42 10 * * ?")
    .ForJob("myJob", "group1")
    .Build();
例子3:每週三10:42,在指定的時區內
trigger = TriggerBuilder.Create()
    .WithIdentity("trigger3", "group1")
    .WithSchedule(CronScheduleBuilder
        .WeeklyOnDayAndHourAndMinute(DayOfWeek.Wednesday, 10, 42)
        .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
    .ForJob(myJobKey)
    .Build();
或者是:
trigger = TriggerBuilder.Create()
    .WithIdentity("trigger3", "group1")
    .WithCronSchedule("0 42 10 ? * WED", x => x
        .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
    .ForJob(myJobKey)
    .Build();

CronTrigger Misfire Instructions

下面說的是在CronTrigger發生misfire的時候通知Quartz做什麼,關於Misfire參照前面講過的章節,這些指令都被定義為常量,指令主要有:
  1. MisfireInstruction.IgnoreMisfirePolicy
  2. MisfireInstruction.CronTrigger.DoNothing
  3. MisfireInstruction.CronTrigger.FireOnceNow

所有的triggers觸發器和觸發器型別都有MisfireInstrution.SmartPolicy通知指令,就是MisfireInstruction.CronTrigger.FireOnceNow,CronTrigger.UpdateAfterMisfire()方法的api詳細解釋了細節。

當我們建立CronTrigger的時候,misfire指令也是我們需要配置到排程資訊中的(通過WithCronSchedule擴充套件方法):

trigger = TriggerBuilder.Create()
    .WithIdentity("trigger3", "group1")
    .WithCronSchedule("0 0/2 8-17 * * ?", x => x
        .WithMisfireHandlingInstructionFireAndProceed())
    .ForJob("myJob", "group1")
    .Build();

返回目錄

龐順龍最後編輯於:3年前

內容均為作者獨立觀點,不代表八零IT人立場,如涉及侵權,請及時告知。

相關文章