Quartz教程四--Trigger介紹

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

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

Trigger的公共屬性

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

trigger的公共屬性有:web

  • jobKey屬性:當trigger觸發時被執行的job的身份;ui

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

  • endTime屬性:表示trigger失效的時間點。好比,」每個月第5天執行」的trigger,若是其endTime是7月1號,則其最後一次執行時間是6月5號。線程

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

優先級(priority)

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

注意:只有同時觸發的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的實現,根據須要進行選擇。

相關文章
相關標籤/搜索