Quartz.Net進階之四:CronTrigger 詳述


          以前都是將所有的內容放在一篇文章里,就會導致文章很長,對於學習的人來說,有時候這也是一個障礙。所以,以后我的寫作習慣,我就會把我寫的文章縮短,但是內容不會少,內容更集中。這樣,學習起來也不會很累,很容易看完,也能記得住,不用記得那么多不相關的東西,學習效率也會越高。好了,開始今天的學習計划吧,今天我們要介紹的對象就是 CronTrigger。

    一、CronTrigger 對象概述

        如果您需要一個基於類似日歷的概念而不是基於SimpleTrigger的指定確切間隔來重復的觸發執行作業計划,那么CronTrigger通常比SimpleTrigger更有用。
        
        使用CronTrigger,您可以指定諸如“每個星期五中午”或“每個工作日早上9:30”,甚至“每個星期一、星期三和星期五上午9:00至10:00之間的每5分鍾”的觸發時間表。
        即便如此,像SimpleTrigger一樣,CronTrigger也有一個startTime屬性,用於指定計划何時生效,以及一個(可選的)endTime屬性,用於指定何時停止計划。

    二、Cron表達式

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

        1.Seconds

        1.Minutes

                1.Hours

                1.Day-of-Month

                1.Month

                1.Day-of-Week

                1.Year (optional field)

        完整的cron表達式的一個例子是字符串“0 0 12? * WED“ - 表示”每周三中午12點“。

        單個子表達式可以包含范圍和/或列表。例如,前一個示例(讀作“WED”)中的星期日字段可以用“MON-FRI”、“MON,WED,FRI”甚至“MON-WED,SAT”替換。

        通配符(''字符)可用於表示該字段的“每個”可能值。 因此,前一個例子的“月”字段中的''字符僅表示“每個月”。 周日字段中的'*'顯然意味着“一周中的每一天”。

        所有字段都有一組可以指定的有效值。這些值應該是相當明顯的,比如數字0到59表示秒和分鍾,數值0到23表示小時。每月的日期可以是0-31的任何值,但您需要注意一個月內的天數!月份可以指定為0到11之間的值,或者使用字符串JAN、FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、OCT、NOV和DEC。星期幾可以指定為1到7之間的值(1 =星期日)或使用字符串SUN,MON,TUE,WED,THU,FRI和SAT。

        '/'字符可用於指定值的增量。 例如,如果在“分鍾”字段中輸入“0/15”,則表示“每隔15分鍾,從零分鍾開始”。 如果您在“分鍾”字段中使用“3/20”,則表示“每小時每20分鍾一次,從第3分鍾開始” - 或者換句話說,它與在“分鍾”中指定“3,23,43”相同。

        “?”字符允許用於日期和星期字段。 它用於指定“無特定值”。 當您需要在兩個字段之一中指定某些內容而不是另一個字段時,這非常有用。 請參閱下面的示例(和CronTrigger API文檔)以獲得說明。

        “L”字符允許用於日期和星期字段。 這個字符是“last”的簡寫,但它在兩個字段的中具有不同的含義。 例如,日期字段中的“L”值表示“月份的最后一天” -  1月31日,非閏年2月28日。 如果在星期字段中單獨使用,則僅表示“7”或“SAT”。如果在星期字段中在另一個值后使用了“L”,則表示“該月的最后一個xxx日” - 例如“6L”或“FRIL”均表示“該月的最后一個星期五”。 使用“L”選項時,重要的是不要指定列表或值范圍,因為您得到的結果並不是你想要的。

        'W'用於指定最接近給定日期的工作日(周一至周五)。 例如,如果您指定“15W”作為日期字段的值,則含義為:“最接近的工作日到該月的15日”。

        ‘#’這個詞是用來指定這個月的“第n個”XXX工作日。例如,星期幾字段中的“6#3”或“FRI#3”的值表示“本月的第三個星期五”。


    三、示例 Cron 表達式

        以下是表達式及其含義的更多示例 - 您可以在CronTrigger的API文檔中找到更多

        CronTrigger示例1  - 用於創建觸發器的表達式,該觸發器每5分鍾觸發一次

            "0 0/5 * * * ?"

        CronTrigger示例2  - 用於創建觸發器的表達式,該觸發器在每分鍾10秒后(即上午10:00:10,上午10:05:10等)每5分鍾觸發一次。

            "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:00,即8:00,8:30,9:00和9:30觸發

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

        請注意,某些計划要求過於復雜,無法通過單個觸發器表達 - 例如“上午9:00至上午10:00之間每隔5分鍾,下午1:00至晚上10:00之間每20分鍾”。 此方案中的解決方案是創建兩個觸發器,並注冊它們以運行相同的作業。
        

    四、建立CronTriggers

        CronTrigger實例是使用TriggerBuilder(用於觸發器的主要屬性)和WithCronSchedule擴展方法(用於特定於CronTrigger的屬性)構建的。

        您還可以使用CronScheduleBuilder的靜態方法來創建計划。

        建立一個觸發器,每天上午8點到下午5點之間每隔一分鍾觸發一次:

1             trigger = TriggerBuilder.Create()
2                 .WithIdentity("trigger3", "group1")
3                 .WithCronSchedule("0 0/2 8-17 * * ?")
4                 .ForJob("myJob", "group1")
5                 .Build();


        構建一個觸發器,每天上午10:42觸發:

 1             // we use CronScheduleBuilder's static helper methods here
 2             trigger = TriggerBuilder.Create()
 3                 .WithIdentity("trigger3", "group1")
 4                 .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(10, 42))
 5                 .ForJob(myJobKey)
 6                 .Build();
 7             
 8             或者
 9 
10             trigger = TriggerBuilder.Create()
11                 .WithIdentity("trigger3", "group1")
12                 .WithCronSchedule("0 42 10 * * ?")
13                 .ForJob("myJob", "group1")
14                 .Build();


        構建一個觸發器,該觸發器將在星期三上午10點42分在TimeZone中觸發,而不是系統的默認值:

 1             trigger = TriggerBuilder.Create()
 2                 .WithIdentity("trigger3", "group1")
 3                 .WithSchedule(CronScheduleBuilder
 4                     .WeeklyOnDayAndHourAndMinute(DayOfWeek.Wednesday, 10, 42)
 5                     .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
 6                 .ForJob(myJobKey)
 7                 .Build();
 8 
 9             或者
10 
11             trigger = TriggerBuilder.Create()
12                 .WithIdentity("trigger3", "group1")
13                 .WithCronSchedule("0 42 10 ? * WED", x => x
14                     .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
15                 .ForJob(myJobKey)
16                 .Build();



    五、CronTrigger Misfire 說明

        以下說明可用於告知Quartz當CronTrigger發生失效時它應該做什么。 (在本教程的“更多關於觸發器”部分中介紹了失效情況)。 這些指令以常量定義(並且API文檔具有對其行為的描述)。 說明包括:

            
            MisfireInstruction.IgnoreMisfirePolicy

            MisfireInstruction.CronTrigger.DoNothing

            MisfireInstruction.CronTrigger.FireOnceNow

        所有觸發器都可以使用MisfireInstrution.SmartPolicy指令,該指令也是所有觸發器類型的默認指令。 CronTrigger將“smart policy”指令解釋為MisfireInstruction.CronTrigger.FireOnceNow。 CronTrigger.UpdateAfterMisfire()方法的API文檔解釋了此行為的確切詳細信息。

        在構建CronTriggers時,您將失效指令指定為cron調度的一部分(通過WithCronSchedule擴展方法):

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



    六、總結

          今天要寫的內容差不多了,由於個人的翻譯水平有限,可能存在不正確的地方,為了讓大家可以看到原文,這樣可以有個更好的理解,我也把原地址貼出來。原文地址如下:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/crontriggers.html

        不忘初心,繼續努力。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM