Quartz.Net进阶之二:关于触发器的更多信息
?? ???? 與作業(yè)一樣,觸發(fā)器相對容易使用,但是在您可以充分利用Quartz.NET之前,確實需要了解和理解各種可自定義的選項。 此外,如前所述,您可以選擇不同類型的觸發(fā)器來滿足不同的調(diào)度需求。
?? ?1、常見觸發(fā)器屬性(Common Trigger Attributes)
?? ??? ?除了所有觸發(fā)器類型都具有用于跟蹤其身份的TriggerKey屬性之外,還有許多其他屬性對所有觸發(fā)器類型都是通用的。 在構(gòu)建觸發(fā)器定義時,使用TriggerBuilder設(shè)置這些常用屬性(后面將舉例說明)。
?? ??? ?以下是所有觸發(fā)器類型共有的屬性列表:
?? ??? ???? 1)、JobKey 屬性指示觸發(fā)器觸發(fā)時應(yīng)該執(zhí)行作業(yè)的標(biāo)識。
?? ??? ???? 2)、StartTimeUtc 屬性指示觸發(fā)器的計劃首次生效是什么時候。該值是DateTimeOffset對象,用于定義給定日歷日期的時刻。對于某些觸發(fā)器類型,觸發(fā)器實際上會在開始時觸發(fā),對于其他觸發(fā)器類型,它只是標(biāo)記應(yīng)該開始遵循調(diào)度的時間。這意味著您可以存儲一個觸發(fā)器,其中包含一個計劃,例如1月份的“每月的第5天”,如果StartTimeUtc屬性設(shè)置為4月1日,則會在第一次觸發(fā)前幾個月。
?? ??? ???? 3)、EndTimeUtc 屬性指示觸發(fā)器的調(diào)度計劃何時不再有效。換句話說,具有“每月的第5天”和7月1日結(jié)束時間表的觸發(fā)器將在6月5日的最后一次觸發(fā)后將結(jié)束。
?? ??? ?其他的屬性需要更多時間來解釋,將在以下小節(jié)中討論。
?? ?2、優(yōu)先級
?? ?
?? ??? ?有時,當(dāng)您有許多觸發(fā)器(或Quartz.NET線程池中的工作線程比較少)時,Quartz.NET可能沒有足夠的資源來立即觸發(fā)計劃中該同時觸發(fā)的所有觸發(fā)器。 在這種情況下,您可能希望控制哪些觸發(fā)器在可用的Quartz.NET工作線程中首先觸發(fā)。為此,您可以在Trigger上設(shè)置priority屬性。 如果同時觸發(fā)N個觸發(fā)器,但是當(dāng)前只有Z個工作線程可用,則首先執(zhí)行具有最高優(yōu)先級的第一個Z觸發(fā)器。如果未在觸發(fā)器上設(shè)置優(yōu)先級,則它將使用默認優(yōu)先級5,優(yōu)先級的值可以是任何整數(shù)值,包括正數(shù)或者負數(shù)。
?? ??? ?注意:優(yōu)先級僅在觸發(fā)器具有相同的激活時間時才進行比較。定于10:59激活的觸發(fā)器總是在定于11:00激活的觸發(fā)器之前開火。
?? ??? ?注意:當(dāng)檢測到觸發(fā)器的作業(yè)需要恢復(fù)時,其恢復(fù)的調(diào)度優(yōu)先級與原始觸發(fā)器相同。
?? ?3、Misfire Instructions
?? ??? ?觸發(fā)器的另一個重要特性是它的“失火指令”。 如果持久性觸發(fā)器由于調(diào)度程序被關(guān)閉而“錯過”其觸發(fā)時間,或者因為Quartz.NET的線程池中沒有可用于執(zhí)行作業(yè)的線程,則會發(fā)生失敗。 不同的觸發(fā)類型可以使用不同的失火指令。 默認情況下,它們使用“智能策略”指令 - 該指令具有基于觸發(fā)類型和配置的動態(tài)行為。 當(dāng)調(diào)度程序啟動時,它會搜索任何已失效的持久觸發(fā)器,然后根據(jù)各自配置的失火指令更新每個觸發(fā)器。 當(dāng)您在自己的項目中開始使用Quartz.NET時,您應(yīng)該熟悉在給定觸發(fā)器類型上定義的失火指令,并在其API文檔中進行了解釋。 有關(guān)失火指令的更多具體信息將在特定于每種觸發(fā)類型的教程課程中給出。
?? ?4、Calendars
?? ??? ?實現(xiàn)ICalendar接口的Quartz.NET Calendar對象可以在觸發(fā)器存儲在調(diào)度程序中時與觸發(fā)器相關(guān)聯(lián)。 日歷可用于從觸發(fā)器的觸發(fā)計劃中排除時間塊。 例如,您可以創(chuàng)建一個觸發(fā)器,在每個工作日上午9:30觸發(fā)作業(yè),但隨后添加一個排除所有業(yè)務(wù)假期的日歷。
?? ??? ?Calendar可以是任何實現(xiàn)ICalendar接口的可序列化對象,如下所示:
?? ??? ?盡管日歷對象可以“阻擋”只有一毫秒那么短的時間段,但很可能,你會對“封鎖”整天的時間感興趣。 為方便起見,Quartz.NET包含了類HolidayCalendar,它就是這樣做的。
?? ??? ?必須實例化日歷對象,并通過AddCalendar(..)方法向調(diào)度程序注冊日歷對象。如果使用HolidayCalendar,則在實例化它之后,應(yīng)該使用它的AddExcludedDate(DateTime日期)方法,可以將從調(diào)度中排除的天數(shù)做參數(shù)傳遞給該方法。同一個日歷實例可以與多個觸發(fā)器一起使用,例如:
?? ??? ?觸發(fā)器的構(gòu)造/構(gòu)建的細節(jié)將在接下來的幾篇文章中給出。 現(xiàn)在,只要相信上面的代碼創(chuàng)建了兩個觸發(fā)器,每個觸發(fā)器計劃每天觸發(fā)。 但是,將跳過在日歷排除的期間內(nèi)發(fā)生的任何發(fā)射。
?? ??? ?有關(guān)可能滿足您需求的許多ICalendar實現(xiàn),請參閱Quartz.Impl.Calendar命名空間。
轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/10607355.html
總結(jié)
以上是生活随笔為你收集整理的Quartz.Net进阶之二:关于触发器的更多信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P3731 二分图匹配必经边
- 下一篇: linux中用anaconda使用不同版