W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
SimpleTrigger可以滿足的調(diào)度需求是:在具體的時間點執(zhí)行一次,或者在具體的時間點執(zhí)行,并且以指定的間隔重復(fù)執(zhí)行若干次。比如,你有一個trigger,你可以設(shè)置它在2015年1月13日的上午11:23:54準(zhǔn)時觸發(fā),或者在這個時間點觸發(fā),并且每隔2秒觸發(fā)一次,一共重復(fù)5次。
根據(jù)描述,你可能已經(jīng)發(fā)現(xiàn)了,SimpleTrigger的屬性包括:開始時間、結(jié)束時間、重復(fù)次數(shù)以及重復(fù)的間隔。這些屬性的含義與你所期望的是一致的,只是關(guān)于結(jié)束時間有一些地方需要注意。
重復(fù)次數(shù),可以是0、正整數(shù),以及常量SimpleTrigger.REPEAT_INDEFINITELY。重復(fù)的間隔,必須是0,或者long型的正數(shù),表示毫秒。注意,如果重復(fù)間隔為0,trigger將會以重復(fù)次數(shù)并發(fā)執(zhí)行(或者以scheduler可以處理的近似并發(fā)數(shù))。
如果你還不熟悉DateBuilder,了解后你會發(fā)現(xiàn)使用它可以非常方便地構(gòu)造基于開始時間(或終止時間)的調(diào)度策略。
endTime屬性的值會覆蓋設(shè)置重復(fù)次數(shù)的屬性值;比如,你可以創(chuàng)建一個trigger,在終止時間之前每隔10秒執(zhí)行一次,你不需要去計算在開始時間和終止時間之間的重復(fù)次數(shù),只需要設(shè)置終止時間并將重復(fù)次數(shù)設(shè)置為REPEAT_INDEFINITELY(當(dāng)然,你也可以將重復(fù)次數(shù)設(shè)置為一個很大的值,并保證該值比trigger在終止時間之前實際觸發(fā)的次數(shù)要大即可)。
SimpleTrigger實例通過TriggerBuilder設(shè)置主要的屬性,通過SimpleScheduleBuilder設(shè)置與SimpleTrigger相關(guān)的屬性。要使用這些builder的靜態(tài)方法,需要靜態(tài)導(dǎo)入:
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import static org.quartz.DateBuilder.*:
下面的例子,是基于簡單調(diào)度(simple schedule)創(chuàng)建的trigger。建議都看一下,因為每個例子都包含一個不同的實現(xiàn)點:
指定時間開始觸發(fā),不重復(fù):
SimpleTrigger trigger = (SimpleTrigger) newTrigger()
.withIdentity("trigger1", "group1")
.startAt(myStartTime) // some Date
.forJob("job1", "group1") // identify job with name, group strings
.build();
指定時間觸發(fā),每隔10秒執(zhí)行一次,重復(fù)10次:
trigger = newTrigger()
.withIdentity("trigger3", "group1")
.startAt(myTimeToStartFiring) // if a start time is not given (if this line were omitted), "now" is implied
.withSchedule(simpleSchedule()
.withIntervalInSeconds(10)
.withRepeatCount(10)) // note that 10 repeats will give a total of 11 firings
.forJob(myJob) // identify job with handle to its JobDetail itself
.build();
5分鐘以后開始觸發(fā),僅執(zhí)行一次:
trigger = (SimpleTrigger) newTrigger()
.withIdentity("trigger5", "group1")
.startAt(futureDate(5, IntervalUnit.MINUTE)) // use DateBuilder to create a date in the future
.forJob(myJobKey) // identify job with its JobKey
.build();
立即觸發(fā),每個5分鐘執(zhí)行一次,直到22:00:
trigger = newTrigger()
.withIdentity("trigger7", "group1")
.withSchedule(simpleSchedule()
.withIntervalInMinutes(5)
.repeatForever())
.endAt(dateOf(22, 0, 0))
.build();
建立一個觸發(fā)器,將在下一個小時的整點觸發(fā),然后每2小時重復(fù)一次:
trigger = newTrigger()
.withIdentity("trigger8") // because group is not specified, "trigger8" will be in the default group
.startAt(evenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00"))
.withSchedule(simpleSchedule()
.withIntervalInHours(2)
.repeatForever())
// note that in this example, 'forJob(..)' is not called which is valid
// if the trigger is passed to the scheduler along with the job
.build();
scheduler.scheduleJob(trigger, job);
請查閱TriggerBuilder和SimpleScheduleBuilder提供的方法,以便對上述示例中未提到的選項有所了解。
TriggerBuilder(以及Quartz的其它builder)會為那些沒有被顯式設(shè)置的屬性選擇合理的默認(rèn)值。比如:如果你沒有調(diào)用withIdentity(..)方法,TriggerBuilder會為trigger生成一個隨機(jī)的名稱;如果沒有調(diào)用startAt(..)方法,則默認(rèn)使用當(dāng)前時間,即trigger立即生效。
SimpleTrigger有幾個misfire相關(guān)的策略,告訴quartz當(dāng)misfire發(fā)生的時候應(yīng)該如何處理。(Misfire策略參考教程四:Trigger介紹)。這些策略以常量的形式在SimpleTrigger中定義(JavaDoc中介紹了它們的功能)。這些策略包括:
SimpleTrigger的Misfire策略常量:
MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
MISFIRE_INSTRUCTION_FIRE_NOW
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT
回顧一下,所有的trigger都有一個Trigger.MISFIRE_INSTRUCTION_SMART_POLICY策略可以使用,該策略也是所有trigger的默認(rèn)策略。
如果使用smart policy,SimpleTrigger會根據(jù)實例的配置及狀態(tài),在所有MISFIRE策略中動態(tài)選擇一種Misfire策略。SimpleTrigger.updateAfterMisfire()的JavaDoc中解釋了該動態(tài)行為的具體細(xì)節(jié)。
在使用SimpleTrigger構(gòu)造trigger時,misfire策略作為基本調(diào)度(simple schedule)的一部分進(jìn)行配置(通過SimpleSchedulerBuilder設(shè)置):
trigger = newTrigger()
.withIdentity("trigger7", "group1")
.withSchedule(simpleSchedule()
.withIntervalInMinutes(5)
.repeatForever()
.withMisfireHandlingInstructionNextWithExistingCount())
.build();
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: