# 简单触发器
如果您需要在某个特定时间点执行一次作业,或者在某个时间点执行,然后以特定间隔重复,简单触发器SimpleTrigger
应该可以满足您的调度需求。例如,如果你想让触发器在2015年1月13日上午11:23:54触发,或者你想让它在那个时候触发,然后再触发五次,每十秒发射一次。
通过这种描述,您可能会发现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) //随意设定一个日期
.forJob("job1", "group1") //设定作业名称和群组
.build();
为特定时刻建立触发器,然后每十秒重复十次:
trigger = newTrigger()
.withIdentity("trigger3", "group1")
.startAt(myTimeToStartFiring) //如果开始时间未指定(没有本行代码),将会设定为当前
.withSchedule(simpleSchedule()
.withIntervalInSeconds(10)
.withRepeatCount(10)) //注意,10次重复将导致总共11次触发
.forJob(myJob) //使用JobDetail本身的句柄标识作业
.build();
建立一个在未来五分钟内触发一次的触发器:
trigger = (SimpleTrigger) newTrigger()
.withIdentity("trigger5", "group1")
.startAt(futureDate(5, IntervalUnit.MINUTE)) //使用DateBuilder设定的一个未来日期
.forJob(myJobKey) //使用作业键定义该作业
.build();
建立一个触发器,立即启动,然后每五分钟重复一次,直到22:00:
trigger = newTrigger()
.withIdentity("trigger7", "group1")
.withSchedule(simpleSchedule()
.withIntervalInMinutes(5)
.repeatForever())
.endAt(dateOf(22, 0, 0))
.build();
建立一个触发器,在下一个小时的起点触发,然后每2小时重复一次,直到永远:
trigger = newTrigger()
.withIdentity("trigger8") //由于群组未指定,trigger8将会并入默认组
.startAt(evenHourDate(null)) //以后每一小时开始执行(分钟和秒设定为“00:00”)
.withSchedule(simpleSchedule()
.withIntervalInHours(2)
.repeatForever())
//注意本例中,forJob(..)未调用
// - 如果触发器与作业一起传递给调度器,则该值有效
.build();
scheduler.scheduleJob(trigger, job);
花一些时间查看TriggerBuilder
和SimpleScheduleBuilder
定义的语言中的所有可用方法,以便您熟悉上面示例中可能未演示的可用选项。
请注意,TriggerBuilder(以及Quartz的其他生成器)通常会为您未明确设置的属性选择一个合理的值。例如:如果您不调用withIdentity(..)方法之一,那么TriggerBuilder将为您的触发器生成一个随机名称;如果不调用startAt(..),则假定当前时间(立即)。
# 简单触发器未触发指令
简单触发器有几个指令,可用于通知Quartz在发生未触发时应该做什么。(在“第4课:更多关于触发器”中介绍了未触发情况)。这些指令被定义为简单触发器本身的常量(包括描述其行为的Java文档)。说明包括:
简单触发器的未触发指令常量
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
指令可用,该指令也是所有触发器类型的默认指令。
如果使用“智能策略”指令,简单触发器将根据给定简单触发器实例的配置和状态在其各种MISFIRE
指令之间动态选择。Java文档中的SimpleTrigger.updateAfterMisfire()
方法解释了这种动态行为的确切细节。
在构建简单触发器时,可以将未触发指令指定为简单计划的一部分(通过SimpleSchedulerBuilder
):
trigger = newTrigger()
.withIdentity("trigger7", "group1")
.withSchedule(simpleSchedule()
.withIntervalInMinutes(5)
.repeatForever()
.withMisfireHandlingInstructionNextWithExistingCount())
.build();

微信公众号

QQ交流群
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。