Quartz 教程
Table of Contents | ‹ Lesson 4 | Lesson 6 ›
課程 5: SimpleTrigger
SimpleTrigger 應該可以滿足你的調度需求,如果你需要在一個特定時間完成一個工作,或者在一個指定的時間內重複執行。例如,你想要觸發器在2015年1月13日11:23:54秒AM觸發,或者你想它在這個時間點每10秒再觸發5次。
有了這些描述,你可能會發現一個SimpleTrigger觸發器包含:start-time、end-time、repeat count,和repeat interval。這些屬性都是你所瞭解的,只有一些對於end-time屬性的特殊說明。
重複次數可以爲0,一個正數,或者一個常量值SimpleTigeer.REPEAT_INDEFINITELY。重複間隔屬性必須是0,或者一個正long類型,表示幾毫秒。注意重複講個爲0將會導致"重複次數"的的觸發器觸發在同時執行。
如果你還不熟悉Quartz的DateBulder類,你可能會發現它有助於幫助你計算你觸發器的觸發時間,根據你創建的StartTime(或者endTime)。
endTime屬性(如果你指定了) 覆蓋重複計數屬性。如果你希望創建一個觸發器,例如每10秒觸發一次,直到某個時間 - 而不是計算它在開始時間和結束時間的重複次數,你可以指定結束時間,然後使用REPEAT_INDEFINITELY的重複次數。
SimpleTrigger實例使用TriggerBuider構建(關於觸發器的主要屬性)和SimpleScheduleBuider() instances are built using TriggerBuilder (for the trigger’s main properties) and SimpleScheduleBuilder (SimpleTrigger-specific屬性). 使用DSL風格構建,使用靜態導入如下所示:
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import static org.quartz.DateBuilder.*:
下面是定義簡單調度程序觸發器的各種例子,通讀一遍,他們每一個都至少有一點新的/不同點。
在無重複情況,構造一個指定時間的觸發器:
SimpleTrigger trigger = (SimpleTrigger) newTrigger()
.withIdentity("trigger1", "group1")
.startAt(myStartTime) // some Date
.forJob("job1", "group1") // identify job with name, group strings
.build();
構造一個指定時間開始的觸發器,接着每十秒執行1次,執行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分鐘觸發一次的觸發器:
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();
構造一個當前時間開始的觸發器,每5分鐘觸發一次,直到22:00分結束:
trigger = newTrigger()
.withIdentity("trigger7", "group1")
.withSchedule(simpleSchedule()
.withIntervalInMinutes(5)
.repeatForever())
.endAt(dateOf(22, 0, 0))
.build();
構造一個在一小時內將會觸發的觸發器,接着每2小時觸發一次,直到永遠:
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和SimpleScheduleBuider的所有可用方法,這樣你就可以熟悉你所有的選項,而這些選項上面例子可能沒有。
注意TriggerBuilder (Quartz的其他構造器)沒有顯示指定屬性時,會默認設置一個合理的屬性。例如: 如果你沒有調用*withIdentity*之一的方法,那麼TriggerBuilder將會自動生成一個隨機trigger的名字;如果你沒有調用*startAt(..)*那麼就會假定使用當前時間。
SimpleTrigger失敗指令
SimpleTrigger有幾個指令可用用來告知Quartz在失敗時做什麼。(失敗情況在課程4:更多Triggers介紹)。這些指令被定義爲SimpleTrigger的常量(包括JavaDoc所介紹的行爲)。這些指令包含:
SimpleTrigger失敗指令常量
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.MISFIRE_INSTRUCTION_SMART_POLICY指令, 這個指令也是觸發器類型的默認值。
如果使用"智能"策略,SimpleTrigger會自動選擇在多種失敗策略中選擇, 基於配置和SimpleTrigger實例的狀態。JavaDoc的 SimpleTrigger.updateAfterMisfire()方法解釋這種動態行爲信息。
當構建SimpleTriggers, 你可以設置簡單調度程序的失敗指令(通過SimpleSchedulerBuilder):
trigger = newTrigger()
.withIdentity("trigger7", "group1")
.withSchedule(simpleSchedule()
.withIntervalInMinutes(5)
.repeatForever()
.withMisfireHandlingInstructionNextWithExistingCount())
.build();
代碼段 小部件
Code snippet widgets
輕靈劃譯
數據來源: