Quartz.NET 2.x 文件翻譯 - Lesson 4:更多Triggers觸發器說明

龐順龍發表於2019-05-11

Quartz.NET 2.x 文件翻譯 - Lesson 4:更多Triggers觸發器說明 檢視官網英文原文

返回目錄

類似於job任務,Trigger觸發器也是比較簡單實現其觸發工作的,但是也包含了一些我們可以自定義設定的選項,這也是我們在使用Quartz.NET前需要儘量明白和理解的點。此外,就像我們前面的章節探討過一樣,Trigger也有很多種型別的觸發型別,這樣就能最大限度滿足我們在使用過程中的不同排程需求了。

Common Trigger Attributes

事實上,所有的Trigger型別都有各自的TriggerKey來保證獲取跟蹤自身,還有一些其他的公共屬性。這些公共屬性在我們定義Trigger觸發器的時候通過TriggerBuilder建立設定。

下面簡單說下這些Trigger觸發器的一些公共屬性:
JobKey 屬性表明了在Trigger工作的時候執行對應標示的job任務
StartTimeUtc 屬性標示Trigger觸發器工作的時候第一個排程生效的時間,格式是DateTimeOffset物件格式。對於一些Trigger型別來說,觸發動作會在排程開始的時候就啟動,對於其他型別來說,僅僅是標記排程開始時間點等。這就意味著我們可以儲存一個排程時間點的規則,比如每月第一天,每週第三天等。
EndTimeUtc 屬性用於標記schedule排程不再執行的時間點,也就是說比如設定了每月第五天執行,並與7月1號結束,那麼就會在6月5號執行最後一次排程任務。

其他相關的屬性,在接下來再細聊。

Priority

有時候當我們有許多的Trigger觸發器的時候(或者多個quartz.net的工作執行緒),quartz.net有可能沒有足夠的系統資源去同時執行排程任務。在這種情況下,我們就希望能控制我們的Trigger觸發器獲取quartz.net空閒工作執行緒,想要實現這一的方式,我們可以在我們的Trigger觸發器設定優先順序屬性,如果有n多個Trigger觸發器需要在同一時間點執行,但是隻有z個的可用工作執行緒(z<n),那麼具有高優先順序的這些z個Trigger觸發器會在這個時間點執行,如果我們不設定Trigger觸發器的優先順序,那麼會預設優先順序為5,優先順序屬性的數值是整數。

說明:優先順序屬性只有在Trigger觸發器有相同的觸發時間點的時候才會進行比對執行,比如10:59時間點的觸發器會早於11:00的觸發器。

說明:當一個Trigger觸發器檢測到需要被重新恢復的時候,它的優先順序將恢復和原來的優先順序一樣。

Misfire Instructions

另一個屬性就是misfire未觸發屬性了,這一般發生在quartz.net沒有可用工作執行緒或者是排程被關閉,並持續的發生就會導致任務的misfire。不同的Trigger型別有不同的misfire說明。預設情況下它們使用一個基於配置和Trigger型別的動態行為類似於“智慧策略”的指令。當scheduler排程啟動後,會持續監測發生misfire的Trigger觸發器,然後更新每個Trigger觸發器的各自的misfire指令。當我們在專案中開始使用quartz.net的時候,我們需要做的就是明確瞭解每個Trigger型別各自的misfire屬性,能清晰的瞭解每個的獨立api等。更多關於misfire屬性的說明在後面的Trigger型別章節在詳細說明。

Calendars

quartz.net calendar物件實現了ICalendar介面,這樣就可以scheduler排程觸發Trigger的時候依照儲存的時間點執行。Calendar的使用不包括時間段的方式。比如:我們可以建立一個Trigger觸發器,在每個工作日的上午9:30觸發job任務,然後新增一個不包括非工作日的Calendar設定。

Calendar可以是任何可序列化的物件實現iCalendar的介面,就像這樣: 

namespace Quartz
{
	public interface ICalendar
	{
		string Description { get; set; }

		ICalendar CalendarBase { set; get; }

		bool IsTimeIncluded(DateTimeOffset timeUtc);

		DateTime GetNextIncludedTimeUtc(DateTimeOffset timeUtc);
	}
} 
雖然calendar可以精確到毫秒,但是我們最需要的可能是某天內,所以為了方便配置,quartz.net提供了HolidayCalendar類來處理這種情況。


Calendar必須例項化,並且通過scheduler的AddCalendar(..)註冊,如果我們使用holidaycalendar,在例項化之後,我們需要使用它的AddExcludedDate(DateTime date) 方法來實現我們想要排除在外的排程時間段。同一個calendar例項可以在多個Trigger觸發器使用:

Calendar Example

HolidayCalendar cal = new HolidayCalendar();
cal.AddExcludedDate(someDate);

sched.AddCalendar("myHolidays", cal, false);

ITrigger t = TriggerBuilder.Create()
	.WithIdentity("myTrigger")
	.ForJob("myJob")
	.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(9, 30)) // execute job daily at 9:30
	.ModifiedByCalendar("myHolidays") // but not on holidays
	.Build();

// .. schedule job with trigger

ITrigger t2 = TriggerBuilder.Create()
	.WithIdentity("myTrigger2")
	.ForJob("myJob2")
	.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(11, 30)) // execute job daily at 11:30
	.ModifiedByCalendar("myHolidays") // but not on holidays
	.Build();

// .. schedule job with trigger2 

Trigger觸發器的詳細建立細節我們在下一個章節在討論,上面的程式碼就是建立兩個觸發器,每一個任務每天都會被觸發,但是calendar設定的跳過時間段任務將會跳過不執行。

在Quartz.Impl.Calendar名稱空間下的ICalendar介面實現,可能也有你需要的。

返回目錄

龐順龍最後編輯於:3年前

內容均為作者獨立觀點,不代表八零IT人立場,如涉及侵權,請及時告知。

相關文章