與job一樣,trigger也很容易使用,但是還有一些擴(kuò)展選項(xiàng)需要理解,以便更好地使用quartz。trigger也有很多類型,我們可以根據(jù)實(shí)際需要來選擇。
最常用的兩種trigger會分別在第5課:SimpleTrigger和第6課:CronTrigger中講到。
所有類型的trigger都有TriggerKey這個屬性,表示trigger的身份;除此之外,trigger還有很多其它的公共屬性。這些屬性,在構(gòu)建trigger的時候可以通過TriggerBuilder設(shè)置。
trigger的公共屬性有:
其它的屬性,會在下文中解釋。
如果你的trigger很多(或者Quartz線程池的工作線程太少),Quartz可能沒有足夠的資源同時觸發(fā)所有的trigger;這種情況下,你可能希望控制哪些trigger優(yōu)先使用Quartz的工作線程,要達(dá)到該目的,可以在trigger上設(shè)置priority屬性。比如,你有N個trigger需要同時觸發(fā),但只有Z個工作線程,優(yōu)先級最高的Z個trigger會被首先觸發(fā)。如果沒有為trigger設(shè)置優(yōu)先級,trigger使用默認(rèn)優(yōu)先級,值為5;priority屬性的值可以是任意整數(shù),正數(shù)、負(fù)數(shù)都可以。
注意:只有同時觸發(fā)的trigger之間才會比較優(yōu)先級。10:59觸發(fā)的trigger總是在11:00觸發(fā)的trigger之前執(zhí)行。
注意:如果trigger是可恢復(fù)的,在恢復(fù)后再調(diào)度時,優(yōu)先級與原trigger是一樣的。
trigger還有一個重要的屬性misfire;如果scheduler關(guān)閉了,或者Quartz線程池中沒有可用的線程來執(zhí)行job,此時持久性的trigger就會錯過(miss)其觸發(fā)時間,即錯過觸發(fā)(misfire)。不同類型的trigger,有不同的misfire機(jī)制。它們默認(rèn)都使用“智能機(jī)制(smart policy)”,即根據(jù)trigger的類型和配置動態(tài)調(diào)整行為。當(dāng)scheduler啟動的時候,查詢所有錯過觸發(fā)(misfire)的持久性trigger。然后根據(jù)它們各自的misfire機(jī)制更新trigger的信息。當(dāng)你在項(xiàng)目中使用Quartz時,你應(yīng)該對各種類型的trigger的misfire機(jī)制都比較熟悉,這些misfire機(jī)制在JavaDoc中有說明。關(guān)于misfire機(jī)制的細(xì)節(jié),會在講到具體的trigger時作介紹。
Quartz的Calendar對象(不是java.util.Calendar對象)可以在定義和存儲trigger的時候與trigger進(jìn)行關(guān)聯(lián)。Calendar用于從trigger的調(diào)度計(jì)劃中排除時間段。比如,可以創(chuàng)建一個trigger,每個工作日的上午9:30執(zhí)行,然后增加一個Calendar,排除掉所有的商業(yè)節(jié)日。
任何實(shí)現(xiàn)了Calendar接口的可序列化對象都可以作為Calendar對象,Calendar接口如下:
package org.quartz;
public interface Calendar {
public boolean isTimeIncluded(long timeStamp);
public long getNextIncludedTime(long timeStamp);
}
注意到這些方法的參數(shù)類型為long。你也許猜到了,他們就是毫秒單位的時間戳。即Calendar排除時間段的單位可以精確到毫秒。你也許對“排除一整天”的Calendar比較感興趣。Quartz提供的org.quartz.impl.HolidayCalendar類可以很方便地實(shí)現(xiàn)。
Calendar必須先實(shí)例化,然后通過addCalendar()方法注冊到scheduler。如果使用HolidayCalendar,實(shí)例化后,需要調(diào)用addExcludedDate(Date date)方法從調(diào)度計(jì)劃中排除時間段。以下示例是將同一個Calendar實(shí)例用于多個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
接下來的幾個課程將介紹觸發(fā)器的施工/建造細(xì)節(jié)?,F(xiàn)在,只要認(rèn)為上面的代碼創(chuàng)建了兩個觸發(fā)器,每個觸發(fā)器都計(jì)劃每天觸發(fā)。然而,在日歷所排除的期間內(nèi)發(fā)生的任何發(fā)射都將被跳過。
請參閱org.quartz.impl.calendar包,了解適合您需要的多個Calendar實(shí)現(xiàn)。
更多建議: