Quartz教程四:Trigger

原文連接 | 譯文連接 | 翻譯:nkcoderjava

本系列教程由quartz-2.2.x官方文檔翻譯、整理而來,但願給一樣對quartz感興趣的朋友一些參考和幫助,有任何不當或錯誤之處,歡迎指正;有興趣研究源碼的同窗,能夠參考我對quartz-core源碼的註釋(進行中)git

與job同樣,trigger也很容易使用,可是還有一些擴展選項須要理解,以便更好地使用quartz。trigger也有不少類型,能夠根據實際須要來選擇。github

最經常使用的兩種trigger會分別在教程五:SimpleTrigger教程六:CronTrigger中講到;編程

 

Trigger的公共屬性

全部類型的trigger都有TriggerKey這個屬性,表示trigger的身份;除此以外,trigger還有不少其它的公共屬性。這些屬性,在構建trigger的時候能夠經過TriggerBuilder設置。併發

trigger的公共屬性有:less

  • jobKey屬性:當trigger觸發時被執行的job的身份;
  • startTime屬性:設置trigger第一次觸發的時間;該屬性的值是java.util.Date類型,表示某個指定的時間點;有些類型的trigger,會在設置的startTime時當即觸發,有些類型的trigger,表示其觸發是在startTime以後開始生效。好比,如今是1月份,你設置了一個trigger–「在每月的第5天執行」,而後你將startTime屬性設置爲4月1號,則該trigger第一次觸發會是在幾個月之後了(即4月5號)。
  • endTime屬性:表示trigger失效的時間點。好比,」每個月第5天執行」的trigger,若是其endTime是7月1號,則其最後一次執行時間是6月5號。

其它的屬性,會在下面的小節中解釋。ui

優先級(priority)

若是你的trigger不少(或者Quartz線程池的工做線程太少),Quartz可能沒有足夠的資源同時觸發全部的trigger;這種狀況下,你可能但願控制哪些trigger優先使用Quartz的工做線程,要達到該目的,能夠在trigger上設置priority屬性。好比,你有N個trigger須要同時觸發,但只有Z個工做線程,優先級最高的Z個trigger會被首先觸發。若是沒有爲trigger設置優先級,trigger使用默認優先級,值爲5;priority屬性的值能夠是任意整數,正數、負數均可以。spa

注意:只有同時觸發的trigger之間纔會比較優先級。10:59觸發的trigger老是在11:00觸發的trigger以前執行。線程

注意:若是trigger是可恢復的,在恢復後再調度時,優先級與原trigger是同樣的。翻譯

錯過觸發(misfire)

trigger還有一個重要的屬性misfire;若是scheduler關閉了,或者Quartz線程池中沒有可用的線程來執行job,此時持久性的trigger就會錯過(miss)其觸發時間,即錯過觸發(misfire)。不一樣類型的trigger,有不一樣的misfire機制。它們默認都使用「智能機制(smart policy)」,即根據trigger的類型和配置動態調整行爲。當scheduler啓動的時候,查詢全部錯過觸發(misfire)的持久性trigger。而後根據它們各自的misfire機制更新trigger的信息。當你在項目中使用Quartz時,你應該對各類類型的trigger的misfire機制都比較熟悉,這些misfire機制在JavaDoc中有說明。關於misfire機制的細節,會在講到具體的trigger時做介紹。

日曆(calendar)

Quartz的Calendar對象(不是java.util.Calendar對象)能夠在定義和存儲trigger的時候與trigger進行關聯。Calendar用於從trigger的調度計劃中排除時間段。好比,能夠建立一個trigger,每一個工做日的上午9:30執行,而後增長一個Calendar,排除掉全部的商業節日。

任何實現了Calendar接口的可序列化對象均可以做爲Calendar對象,Calendar接口以下:

package org.quartz; public interface Calendar { public boolean isTimeIncluded(long timeStamp); public long getNextIncludedTime(long timeStamp); } 

注意到這些方法的參數類型爲long。你也許猜到了,他們就是毫秒單位的時間戳。即Calendar排除時間段的單位能夠精確到毫秒。你也許對「排除一成天」的Calendar比較感興趣。Quartz提供的org.quartz.impl.HolidayCalendar類能夠很方便地實現。

Calendar必須先實例化,而後經過addCalendar()方法註冊到scheduler。若是使用HolidayCalendar,實例化後,須要調用addExcludedDate(Date date)方法從調度計劃中排除時間段。如下示例是將同一個Calendar實例用於多個trigger:

HolidayCalendar cal = new HolidayCalendar(); cal.addExcludedDate( someDate ); cal.addExcludedDate( someOtherDate ); sched.addCalendar("myHolidays", cal, false); Trigger t = newTrigger() .withIdentity("myTrigger") .forJob("myJob") .withSchedule(dailyAtHourAndMinute(9, 30)) // execute job daily at 9:30 .modifiedByCalendar("myHolidays") // but not on holidays .build(); // .. schedule job with trigger Trigger t2 = newTrigger() .withIdentity("myTrigger2") .forJob("myJob2") .withSchedule(dailyAtHourAndMinute(11, 30)) // execute job daily at 11:30 .modifiedByCalendar("myHolidays") // but not on holidays .build(); // .. schedule job with trigger2 

構造trigger的細節將在接下來的幾節中講到。就如今,只須要知道上面的代碼建立了兩個trigger,都是天天執行一次。可是在Calendar定義的時間段內,trigger的執行被跳過。

org.quartz.impl.calendar包下有各類Calendar的實現,根據須要進行選擇。

原創文章,轉載請註明: 轉載自併發編程網 – ifeve.com本文連接地址: Quartz教程四:Trigger

相關文章
相關標籤/搜索