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
轻灵划译
数据来源: