第四課 更多關於Triggersui
跟做業任務相似,觸發器也很是容易使用,可是在你可以充分掌握Quartz以前,你須要知道並理解許多觸發器的客戶化的參數。前面已經提到過,有許多不一樣類型的觸發器供你選擇,適用不一樣的調度需求。
你將會在第五課 Simple Trigger和第六課 Triggers學到這兩種經常使用的觸發器類型。
觸發器通用屬性spa
全部類型的觸發器都有TriggerKey屬性去跟蹤觸發器標識,除了這一個事實以外,還有許多其餘的屬性,對全部觸發器類型都適用。這些通用屬性在建立觸發器定義時經過TriggerBuilder類來設定的。
下面的屬性列表對全部類型的觸發器都通用:
jobKey表示job實例的標識,觸發器被觸發時,該指定的job實例會執行。
StartTimeUtc 屬性表示觸發器的時間表首次被觸發的時間。它的值是定義由指定日曆時間的DateTimeOffset 對象。對於一些類型的觸發器,會在啓動時間觸發,另外一些觸發器則僅僅是標示了調度器將要被觸發的時間。這意味着你能夠在調度器中存儲一個觸發器,例如每個月的5號,若是如今是一月份,而startTime參數又設置爲4月1日,那這樣須要幾個月後觸發器纔會第一次被觸發。
EndTimeUtc 屬性指定觸發器的再也不被觸發的時間,換言之,調度器中的觸發器定義爲「每個月的5號」,並且endTime設置爲7月1日,那麼6月5日將會是最後一次觸發的日期。
其它的屬性,更多更詳細的講解將會在接下來的子章節中進行討論。
Priority(優先級)線程
有些時候,當你有許多觸發器(或Quartz線程池中只有少數幾個工做線程),Quartz可能沒有足夠的資源去觸發全部的在同一時間段內排定好的觸發器。既然這樣,你可能指望控制哪一個觸發器能第一個得到Quartz空閒工做線程的調用。爲了達到這個目的,你能夠設定觸發器的Priority屬性。若是N個觸發器在同一時間內被觸發,但只有Z工做線程當前空閒可用,那麼擁有最高優先級的Z觸發器將會第一個被觸發。若是你沒有設置觸發器的優先級,它將會使用默認的優先級,優先級值爲5.任何Integer類型的值均可以做爲優先級,正數負數均可以。
提示:優先級只是用於在同一時間被觸發的觸發器進行比較。一個安排在10:59分觸發的觸發器永遠要比安排在11:00的觸發器先執行。
提示:當一個觸發器的做業任務發現設置了請求恢復參數,在恢復調度執行時的優先級和原來的同樣。code
觸發失敗指令
對象
觸發器另一個重要的屬性就是「misfireinstruction」。觸發失敗的狀況是因爲調度器被關閉致使存儲的觸發器錯過了觸發的時間,或是因爲Quartz線程池內沒有空閒的線程去執行做業任務。不一樣類型的觸發器有不一樣的觸發失敗處理機制。默認狀況下使用「智能策略」指令——基於觸發器類型和配置的動態機制。當調度器啓動時,它會查詢全部存儲的、觸發失敗的觸發器,而後根據各自配置的觸發失敗指令更新觸發器。當你開始在你的項目中使用Quartz時,你應該讓本身熟悉在給定觸發器類型上定義的觸發失敗指令和API上的文檔解釋。更多關於觸發失敗指令的詳細信息將會在教程裏每一個觸發器類型課程中做詳細介紹。blog
Calendars(日曆)教程
當觸發器在調度器中建立和存儲時,Quartz日曆對象能夠與觸發器相關聯。日曆對觸發器調度定義不包含的時間段很是方便。例如,你能夠建立一個觸發器,定義在每一個工做日上午9:30分觸發做業任務,另外添加一個日曆表排除當中全部的假期。
日曆對象能夠是實現Calendar接口的任何可序列化的對象,以下所示:
Calendar接口
接口
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 }
日曆實例化和註冊到調度器中必須經過addCalendar方法。若是你使用HolidayCalendar,初始化對象完成後,應該使用addExcludedDate(Datedate)方法方便將你但願從調度時間表中排除的日期添加到日曆實例對象中。同一個日曆實例對象能夠應用於多個觸發器,以下代碼:ip
1 HolidayCalendar cal = new HolidayCalendar(); 2 cal.AddExcludedDate(someDate); 3 4 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
關於觸發器結構/構建詳細信息將會在後面兩節課中介紹。如今,只須要相信上面的代碼建立了兩個觸發器對象,每一個觸發器天天都會被觸發。然而,任何發生在日曆對象中排除的日期內的觸發將會跳過。
能夠查閱Quartz.Impl.Calendar 包目錄下的幾個Calendar實現類,估計有適合你須要的類資源