.Net Core 使用 Quartz快速入門(二)

上一篇我們通過一個簡單案例講解了如何快速使用Quartz,也遺留了一個問題,那就是面對複雜的業務場景,我們的Trigger如何定義。那這一我們將詳細講解Quartz中的Trigger應用。

一、Trigger策略

Quartz中有兩種Trigger策略分別是:

  1. Simple Trigger

  2. CronTrigger

二、 Simple Trigger

SimpleTrigger可以滿足的調度需求是:在具體的時間點執行一次,或者在具體的時間點執行,並且以指定的間隔重複執行若干次。比如,你有一個trigger,你可以設置它在2015年1月13日的上午11:23:54準時觸發,或者在這個時間點觸發,並且每隔2秒觸發一次,一共重複5次。

根據描述,你可能已經發現了,SimpleTrigger的屬性包括:開始時間、結束時間、重複次數以及重複的間隔。這些屬性的含義與你所期望的是一致的,只是關於結束時間有一些地方需要注意。

重複次數,可以是0、正整數,以及常量SimpleTrigger.REPEAT_INDEFINITELY。重複的間隔,必須是0,或者long型的正數,表示毫秒。注意,如果重複間隔爲0,trigger將會以重複次數併發執行(或者以scheduler可以處理的近似併發數)。

如果你還不熟悉DateBuilder,瞭解後你會發現使用它可以非常方便地構造基於開始時間(或終止時間)的調度策略。

endTime屬性的值會覆蓋設置重複次數的屬性值;比如,你可以創建一個trigger,在終止時間之前每隔10秒執行一次,你不需要去計算在開始時間和終止時間之間的重複次數,只需要設置終止時間並將重複次數設置爲REPEAT_INDEFINITELY(當然,你也可以將重複次數設置爲一個很大的值,並保證該值比trigger在終止時間之前實際觸發的次數要大即可)。

1、每10秒執行一次,重複5次,共6次

var trigger = TriggerBuilder.Create()
                            .WithSimpleSchedule(x => x.WithIntervalInSeconds(10).WithRepeatCount(5))//每10秒執行一次,重複5次,共6次
                            .Build();

2、5分鐘以後開始觸發,僅執行一次

var trigger = TriggerBuilder.Create()
                            .WithSimpleSchedule()
                            .StartAt(DateTimeOffset.Now.AddMinutes(5))
                            .Build();

3、立即觸發,每個5分鐘執行一次,直到10:30:15

var trigger = TriggerBuilder.Create()
                            .WithSimpleSchedule(x => x.WithIntervalInMinutes(5).RepeatForever())
                            .EndAt(DateBuilder.DateOf(10, 30, 15))
                            .Build();

4、在下一個小時的整點觸發,然後每2小時重複一次 

var trigger = TriggerBuilder.Create()
                            .WithSimpleSchedule(x => x.WithIntervalInHours(2).RepeatForever())
                            .StartAt(DateBuilder.EvenHourDate(null))
                            .Build();

三、CronTrigger 

CronTrigger通常比Simple Trigger更有用,如果您需要基於日曆的概念而不是按照SimpleTrigger的精確指定間隔進行重新啓動的作業啓動計劃。

使用CronTrigger,您可以指定號時間表,例如“每週五中午”或“每個工作日和上午9:30”,甚至“每週一至週五上午9:00至10點之間每5分鐘”和1月份的星期五“。

即使如此,和SimpleTrigger一樣,CronTrigger有一個startTime,它指定何時生效,以及一個(可選的)endTime,用於指定何時停止計劃。

Cron Expressions

Cron-Expressions用於配置CronTrigger的實例。Cron Expressions是由七個子表達式組成的字符串,用於描述日程表的各個細節。這些子表達式用空格分隔,並表示:

  1. Seconds
  2. Minutes
  3. Hours
  4. Day-of-Month
  5. Month
  6. Day-of-Week
  7. Year (optional field)

Cron Expressions示例

CronTrigger示例1 - 創建一個觸發器的表達式,每5分鐘就會觸發一次

“0 0/5 * * *?”

CronTrigger示例2 - 創建觸發器的表達式,每5分鐘觸發一次,分鐘後10秒(即上午10時10分,上午10:05:10等)。

“10 0/5 * * *?”

CronTrigger示例3 - 在每個星期三和星期五的10:30,11:30,12:30和13:30創建觸發器的表達式。

“0 30 10-13?* WED,FRI“

CronTrigger示例4 - 創建觸發器的表達式,每個月5日和20日上午8點至10點之間每半小時觸發一次。請注意,觸發器將不會在上午10點開始,僅在8:00,8:30,9:00和9:30

“0 0/30 8-9 5,20 *?”

請注意,一些調度要求太複雜,無法用單一觸發表示 - 例如“每上午9:00至10:00之間每5分鐘,下午1:00至晚上10點之間每20分鐘”一次。在這種情況下的解決方案是簡單地創建兩個觸發器,並註冊它們來運行相同的作業。

 1、每天上午8點至下午5點之間,每隔一分鐘執行

var trigger = TriggerBuilder.Create()
                .WithCronSchedule("0 0/2 8-17 * * ?")
                .Build();

2、 將在每天上午8:30執行

var trigger = TriggerBuilder.Create()
                .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(8, 30))
                .Build();

3、將在星期三上午10:42執行

var trigger = TriggerBuilder.Create()
                .WithCronSchedule("0 42 10 ? * WED", x => x
                .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
                .Build();

 Quartz的Trigger示例就介紹到這裏,你們是否有疑問,如果我們的Job是需要傳遞參數的,那使用Quartz如何給Job傳遞參數呢?咱們且聽下回分解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章