Quartz.Net進階之二:關於觸發器的更多信息


        與作業一樣,觸發器相對容易使用,但是在您可以充分利用Quartz.NET之前,確實需要了解和理解各種可自定義的選項。 此外,如前所述,您可以選擇不同類型的觸發器來滿足不同的調度需求。

    1、常見觸發器屬性(Common Trigger Attributes)

        除了所有觸發器類型都具有用於跟蹤其身份的TriggerKey屬性之外,還有許多其他屬性對所有觸發器類型都是通用的。 在構建觸發器定義時,使用TriggerBuilder設置這些常用屬性(后面將舉例說明)。

        以下是所有觸發器類型共有的屬性列表:

            1)、JobKey 屬性指示觸發器觸發時應該執行作業的標識。

            2)、StartTimeUtc 屬性指示觸發器的計划首次生效是什么時候。該值是DateTimeOffset對象,用於定義給定日歷日期的時刻。對於某些觸發器類型,觸發器實際上會在開始時觸發,對於其他觸發器類型,它只是標記應該開始遵循調度的時間。這意味着您可以存儲一個觸發器,其中包含一個計划,例如1月份的“每月的第5天”,如果StartTimeUtc屬性設置為4月1日,則會在第一次觸發前幾個月。

            3)、EndTimeUtc 屬性指示觸發器的調度計划何時不再有效。換句話說,具有“每月的第5天”和7月1日結束時間表的觸發器將在6月5日的最后一次觸發后將結束。

        其他的屬性需要更多時間來解釋,將在以下小節中討論。


    2、優先級
    
        有時,當您有許多觸發器(或Quartz.NET線程池中的工作線程比較少)時,Quartz.NET可能沒有足夠的資源來立即觸發計划中該同時觸發的所有觸發器。 在這種情況下,您可能希望控制哪些觸發器在可用的Quartz.NET工作線程中首先觸發。為此,您可以在Trigger上設置priority屬性。 如果同時觸發N個觸發器,但是當前只有Z個工作線程可用,則首先執行具有最高優先級的第一個Z觸發器。如果未在觸發器上設置優先級,則它將使用默認優先級5,優先級的值可以是任何整數值,包括正數或者負數。

        注意:優先級僅在觸發器具有相同的激活時間時才進行比較。定於10:59激活的觸發器總是在定於11:00激活的觸發器之前開火。

        注意:當檢測到觸發器的作業需要恢復時,其恢復的調度優先級與原始觸發器相同。


    3、Misfire Instructions

        觸發器的另一個重要特性是它的“失火指令”。 如果持久性觸發器由於調度程序被關閉而“錯過”其觸發時間,或者因為Quartz.NET的線程池中沒有可用於執行作業的線程,則會發生失敗。 不同的觸發類型可以使用不同的失火指令。 默認情況下,它們使用“智能策略”指令 - 該指令具有基於觸發類型和配置的動態行為。 當調度程序啟動時,它會搜索任何已失效的持久觸發器,然后根據各自配置的失火指令更新每個觸發器。 當您在自己的項目中開始使用Quartz.NET時,您應該熟悉在給定觸發器類型上定義的失火指令,並在其API文檔中進行了解釋。 有關失火指令的更多具體信息將在特定於每種觸發類型的教程課程中給出。

    4、Calendars

        實現ICalendar接口的Quartz.NET Calendar對象可以在觸發器存儲在調度程序中時與觸發器相關聯。 日歷可用於從觸發器的觸發計划中排除時間塊。 例如,您可以創建一個觸發器,在每個工作日上午9:30觸發作業,但隨后添加一個排除所有業務假期的日歷。

        Calendar可以是任何實現ICalendar接口的可序列化對象,如下所示:

 1         namespace Quartz
 2         {
 3             public interface ICalendar
 4             {
 5                 string Description { get; set; }
 6 
 7                 ICalendar CalendarBase { set; get; }
 8 
 9                 bool IsTimeIncluded(DateTimeOffset timeUtc);
10 
11                 DateTime GetNextIncludedTimeUtc(DateTimeOffset timeUtc);
12 
13                 ICalendar Clone();
14             }
15         } 


        盡管日歷對象可以“阻擋”只有一毫秒那么短的時間段,但很可能,你會對“封鎖”整天的時間感興趣。 為方便起見,Quartz.NET包含了類HolidayCalendar,它就是這樣做的。

        必須實例化日歷對象,並通過AddCalendar(..)方法向調度程序注冊日歷對象。如果使用HolidayCalendar,則在實例化它之后,應該使用它的AddExcludedDate(DateTime日期)方法,可以將從調度中排除的天數做參數傳遞給該方法。同一個日歷實例可以與多個觸發器一起使用,例如:

 1          HolidayCalendar cal = new HolidayCalendar();
 2          cal.AddExcludedDate(someDate);
 3 
 4          await sched.AddCalendar("myHolidays", cal, false);
 5     
 6          ITrigger t = TriggerBuilder.Create()
 7         .WithIdentity("myTrigger")
 8         .ForJob("myJob")
 9         .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(9, 30)) // execute job daily at 9:30
10         .ModifiedByCalendar("myHolidays") // but not on holidays
11         .Build();
12 
13         // .. schedule job with trigger
14 
15         ITrigger t2 = TriggerBuilder.Create()
16         .WithIdentity("myTrigger2")
17         .ForJob("myJob2")
18         .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(11, 30)) // execute job daily at 11:30
19         .ModifiedByCalendar("myHolidays") // but not on holidays
20         .Build();
21     
22             // .. schedule job with trigger2 


        觸發器的構造/構建的細節將在接下來的幾篇文章中給出。 現在,只要相信上面的代碼創建了兩個觸發器,每個觸發器計划每天觸發。 但是,將跳過在日歷排除的期間內發生的任何發射。

        有關可能滿足您需求的許多ICalendar實現,請參閱Quartz.Impl.Calendar命名空間。


免責聲明!

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



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