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點之間每隔一分鐘觸發一次:
?? ??? ?構建一個觸發器,每天上午10:42觸發:
?? ??? ?構建一個觸發器,該觸發器將在星期三上午10點42分在TimeZone中觸發,而不是系統的默認值:
?? ?五、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擴展方法):
?? ?六、總結
?? ??? ? 今天要寫的內容差不多了,由于個人的翻譯水平有限,可能存在不正確的地方,為了讓大家可以看到原文,這樣可以有個更好的理解,我也把原地址貼出來。原文地址如下:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/crontriggers.html
?? ??? ?不忘初心,繼續努力。
轉載于:https://www.cnblogs.com/PatrickLiu/p/10101964.html
總結
以上是生活随笔為你收集整理的Quartz.Net进阶之四:CronTrigger 详述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git 将代码回到指定版本
- 下一篇: ASP.NET Core的身份认证框架I