Quartz学习笔记(四)SimpleTrigger,CronTrigger
- SimpleTrigger
- SimpleTrigger相关属性设置API
- SimpleTrigger的Misfire策略
- MISFIRE_INSTRUCTION_FIRE_NOW
- MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
- MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_CO
- MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT
- MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT
- MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT
- 默认策略
- CronTrigger
SimpleTrigger
SimpleTrigger主要可以满足一些简单的调度需求,比如在某个时间点执行一次,或者在某个时间点开始执行,然后以某一个时间间隔来重复执行。SimpleTrigger的属性包括:开始时间、结束时间、重复次数以及重复的间隔。其中关于结束时间需要有特殊注意的地方
SimpleTrigger相关属性设置API
方法 | 设置类 | 描述 | 备注 |
---|---|---|---|
startAt(Date triggerStartTime) | TriggerBuilder | 设置任务开始时间 | 用DateBuilder可以轻松获取参数Date |
startNow() | TriggerBuilder | 设置任务开始为当前时间 | |
endAt(Date triggerEndTime) | TriggerBuilder | 设置任务介绍时间 | 用DateBuilder可以轻松获取参数Date |
withIntervalInMilliseconds(long intervalInMillis) | SimpleScheduleBuilder | 设置任务执行间隔,单位:毫秒 | |
withIntervalInSeconds(int intervalInSeconds) | SimpleScheduleBuilder | 设置任务执行间隔,单位:秒 | |
withIntervalInMinutes(int intervalInMinutes) | SimpleScheduleBuilder | 设置任务执行间隔,单位:分 | |
withIntervalInHours(int intervalInHours) | SimpleScheduleBuilder | 设置任务执行间隔,单位:小时 | |
withRepeatCount(int triggerRepeatCount) | SimpleScheduleBuilder | 设置任务重复次数 | |
repeatForever() | SimpleScheduleBuilder | 无限期重复 | |
repeatSecondlyForever(int seconds) | SimpleScheduleBuilder | 设置以多少秒的间隔永远重复 | 重载的方法没有参数,默认1秒 |
repeatMinutelyForever(int minutes) | SimpleScheduleBuilder | 设置以多少分的间隔永远重复 | 重载的方法没有参数,默认1分 |
repeatHourlyForever(int hours) | SimpleScheduleBuilder | 设置以多少小时的间隔永远重复 | 重载的方法没有参数,默认1小时 |
repeatSecondlyForTotalCount(int count, int seconds) | SimpleScheduleBuilder | 以给定的秒数数间隔重复给定的次数 | 重载的方法没有seconds参数,默认1秒 |
repeatMinutelyForTotalCount(int count, int minutes) | SimpleScheduleBuilder | 以给定的分钟数数间隔重复给定的次数 | 重载的方法没有seconds参数,默认1分钟 |
repeatHourlyForTotalCount(int count, int hours) | SimpleScheduleBuilder | 以给定的小时数间隔重复给定的次数 | 重载的方法没有seconds参数,默认1小时 |
上面表格中的方法基本包含了设置SimpleTrigger所有方法,可以看出主要是通过TriggerBuilder和SimpleScheduleBuilder来设置的。其中关于结束时间我们需要注意endTime属性的值会覆盖设置重复次数的属性值。很好理解,假如你设置开始时间为早上8点,结束时间为早上9点,每间隔10分钟执行一次,你是不需要去设置重复次数的,设置了也会被Quertz自动计算的重复次数覆盖。
另一方面,TriggerBuilder(以及Quartz的其它builder)会为那些没有被显式设置的属性选择合理的默认值。比如:如果你没有调用withIdentity(…)方法,TriggerBuilder会为trigger生成一个随机的名称;如果没有调用startAt(…)方法,则默认使用当前时间,即trigger立即生效。
例子代码
指定开始时间和结束时间,每隔10秒执行一次
Date startTime =DateBuilder.dateOf(12, 12, 12, 20, 4, 2019);
Date endTime =DateBuilder.dateOf(12, 14, 12, 20, 4, 2019);
Trigger trigger = TriggerBuilder
.newTrigger().withIdentity("simperTrigger1", "test1")
.startAt(startTime)
.withSchedule(SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(10))
.endAt(endTime)
.build();
SimpleTrigger的Misfire策略
关于Trigge的MisFire策略在之前的学习中已经接触过了,这里在详细分不同的Trigger来学习一下。在Trigger中关于SimpleTrigger的Misfire策略常量如下,并且可以通过SimpleSchedulerBuilder设置
MISFIRE_INSTRUCTION_FIRE_NOW
设置方法:
withMisfireHandlingInstructionFireNow
含义:
——以当前时间为触发频率立即触发执行
——执行至EndTIme的剩余周期次数
——以调度或恢复调度的时刻为基准的周期频率,EndTIme根据剩余次数和当前时间计算得到
——调整后的EndTIme会略大于根据StartTime计算的到的EndTIme值
MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
设置方法:
withMisfireHandlingInstructionIgnoreMisfires
含义:
——以错过的第一个频率时间立刻开始执行
——重做错过的所有频率周期
——当下一次触发频率发生时间大于当前时间以后,按照Interval的依次执行剩下的频率
——共执行RepeatCount+1次
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_CO
设置方法:withMisfireHandlingInstructionNowWithExistingCount
含义:
——以当前时间为触发频率立即触发执行
——执行至EndTIme的剩余周期次数
——以调度或恢复调度的时刻为基准的周期频率,EndTIme根据剩余次数和当前时间计算得到
——调整后的EndTIme会略大于根据StartTime计算的到的EndTIme值
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT
设置方法:withMisfireHandlingInstructionNowWithRemainingCount
含义:
——以当前时间为触发频率立即触发执行
——执行至EndTIme的剩余周期次数
——以调度或恢复调度的时刻为基准的周期频率,EndTIme根据剩余次数和当前时间计算得到
——调整后的EndTIme会略大于根据StartTime计算的到的EndTIme值
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT
设置方法:withMisfireHandlingInstructionNextWithRemainingCount
含义:
——不触发立即执行
——等待下次触发频率周期时刻,执行至EndTIme的剩余周期次数
——以StartTime为基准计算周期频率,并得到EndTIme
——即使中间出现pause,resume以后保持EndTIme时间不变
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT
设置方法:withMisfireHandlingInstructionNextWithExistingCount
含义:
——此指令导致trigger忘记原始设置的StartTime和repeat-count
——触发器的repeat-count将被设置为剩余的次数
——这样会导致后面无法获得原始设定的StartTime和repeat-count值
默认策略
查看源码,SimpleScheduleBuilder中misfireInstruction的默认值是MISFIRE_INSTRUCTION_SMART_POLICY,这是所有Trigger默认的MisFire策略,这个策略会根据Trigger的状态和类型来自动调节MisFire策略。
查看源码可以看到,若设置为默认策略,则按照以下规则来选择MisFire策略
- 如果重复计数为0,则指令将解释为MISFIRE_INSTRUCTION_FIRE_NOW。
- 如果重复计数为REPEAT_INDEFINITELY,则指令将解释为MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT。 警告:如果触发器具有非空的结束时间,则使用MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT可能会导致触发器在失火时间范围内到达结束时,不会再次触发。
- 如果重复计数大于0,则指令将解释为MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT。
CronTrigger
CronTrigger能精确的制定时间和时间间隔,可以通过设置Cron Expressions来配置CronTrigger,Cron Expressions是由七个子表达式组成的字符串,用于描述日程表的各个细节。具体怎么设置可与参照在线Cron表达式生成器,你甚至可以把它内嵌到你的项目中,用于生成cron表达式。
构建CronTrigger
CronTrigger实例使用TriggerBuilder(用于触发器的主要属性)和CronScheduleBuilder(对于CronTrigger特定的属性)构建。
例如,构建一个触发器,每天早上9点至下午6点运行,每一30分钟执行一次。
先通过在线CronB表达式生成器生成表达式:0 0/30 9-18 * * ?
//构建CronTrigger
TriggerBuilder.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule("0 0/30 9-18 * * ? "))
.forJob("jobA", "groupA")
.build();
CronTrigger Misfire
CronTrigger的Misfire有三种如下,可以通过CronSchedulerBuilder设置
MISFIRE_INSTRUCTION_DO_NOTHING
设置方法:withMisfireHandlingInstructionDoNothing
含义:
——不触发立即执行
——等待下次Cron触发频率到达时刻开始按照Cron频率依次执行
MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
设置方法:withMisfireHandlingInstructionIgnoreMisfires
含义:
——以错过的第一个频率时间立刻开始执行
——重做错过的所有频率周期后
——当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行
MISFIRE_INSTRUCTION_FIRE_ONCE_NOW
设置方法:withMisfireHandlingInstructionFireAndProceed
含义:
——以当前时间为触发频率立刻触发一次执行
——然后按照Cron频率依次执行
默认策略
在SimpleTrigger中已经提到所有trigger的默认Misfire策略都是MISFIRE_INSTRUCTION_SMART_POLICY,SimpleTrigger会根据tirgger的状态来调整具体的Misfire策略,而CronTrigger的默认Misfire策略会被CronTrigger解释为MISFIRE_INSTRUCTION_FIRE_NOW,具体可以参照CronTrigger实现类的源码