首页 > 代码库 > quarzt(官方)---给自己看的文档(SimpleTrigger)
quarzt(官方)---给自己看的文档(SimpleTrigger)
第5课:SimpleTrigger
SimpleTrigger应该满足您的调度需求,如果您需要在特定时刻或特定时刻执行完整的作业,然后按特定间隔进行重复。 例如,如果您希望触发器在2015年1月13日正好11:23:54 AM触发,或者如果您希望在那时开火,然后每十秒钟再次触发五次。
有了这个描述,您可能会发现SimpleTrigger的属性包括:开始时间,结束时间,重复计数和重复间隔,可能并不奇怪。 所有这些属性正是您期望的属性,只有与结束时间属性相关的几个特殊说明。
重复计数可以为零,正整数或常量值SimpleTrigger.REPEAT_INDEFINITELY。 重复间隔属性必须为零或正长值,并表示毫秒数。 请注意,重复间隔为零将导致触发器的“重复计数”触发同时发生(或者与调度程序可以管理的同时发生)。
如果您还不熟悉Quartz的DateBuilder类,您可能会发现根据您尝试创建的startTime (或endTime)来计算触发器触发时间有用。
endTime属性(如果指定)将覆盖重复计数属性。 如果您希望创建一个触发器,例如每10秒触发一次直到给定的时间点,而不必计算在开始时间和结束时间之间重复的次数,这可能很有用,你可以简单地指定结束时间,然后使用REPEAT_INDEFINITELY的重复计数(您甚至可以指定一些巨大数字的重复计数,该数量肯定超过触发器在结束时间到达之前实际触发的次数) 。
SimpleTrigger实例使用TriggerBuilder(用于触发器的主要属性)和SimpleScheduleBuilder(对于SimpleTrigger特定的属性)构建。 要以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();
在特定时刻建立一个触发器,然后重复每十秒十次:
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();
建立一个触发器,将来会发生一次,五分钟:
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();
建立一个触发器,现在将触发,然后每五分钟重复一次,直到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和SimpleScheduleBuilder定义的语言中的所有可用方法,以便您可以熟悉上述示例中未被演示的可用选项。
请注意,TriggerBuilder(和Quartz的其他构建器)通常将为您未明确设置的属性选择合理的值。 例如:如果你不调用* withIdentity(..)*方法,那么TriggerBuilder会为你的触发器生成一个随机的名字; 如果不调用* startAt(..)*,则假定当前时间(立即)。
SimpleTrigger失火说明
SimpleTrigger有几个指令可用于通知Quartz在发生失火时应该做什么。 (“第4课:更多关于触发器”中引入了失火情况)。 这些指令定义为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实例的配置和状态动态选择其各种MISFIRE指令。 SimpleTrigger.updateAfterMisfire()方法的JavaDoc解释了这种动态行为的确切细节。
在构建SimpleTriggers时,可以通过SimpleSchedulerBuilder指定misfire指令作为简单计划的一部分:
trigger = newTrigger()
.withIdentity("trigger7", "group1")
.withSchedule(simpleSchedule()
.withIntervalInMinutes(5)
.repeatForever()
.withMisfireHandlingInstructionNextWithExistingCount())
.build();
quarzt(官方)---给自己看的文档(SimpleTrigger)