目录
article
【Quartz】withMisfireHandlingInstruction
【Quartz】withMisfireHandlingInstruction
调度(scheduleJob)或恢复调度(resumeTrigger, resumeJob)后不同的 misfire 对应的处理规则。
CronTrigger
withMisfireHandlingInstructionDoNothing
- 不触发立即执行
- 等待下次 Cron 触发频率到达时刻开始按照 Cron 频率依次执行
withMisfireHandlingInstructionIgnoreMisfires
- 以错过的第一个频率时间立刻开始执行
- 重做错过的所有频率周期后
- 当下一次触发频率发生时间大于当前时间后,再按照正常的 Cron 频率依次执行
withMisfireHandlingInstructionFireAndProceed
- 以当前时间为触发频率立刻触发一次执行
- 然后按照 Cron 频率依次执行
SimpleTrigger
withMisfireHandlingInstructionFireNow
- 以当前时间为触发频率立即触发执行
- 执行至 FinalTime 的剩余周期次数
- 以调度或恢复调度的时刻为基准的周期频率, FinalTime 根据剩余次数和当前时间计算得到
- 调整后的 FinalTime 会略大于根据 StartTime 计算的到的 FinalTime 值
withMisfireHandlingInstructionIgnoreMisfires
- 以错过的第一个频率时间立刻开始执行
- 重做错过的所有频率周期
- 当下一次触发频率发生时间大于当前时间以后,按照 Interval 的依次执行剩下的频率
- 共执行 RepeatCount + 1 次
withMisfireHandlingInstructionNextWithExistingCount
- 不触发立即执行
- 等待下次触发频率周期时刻,执行至 FinalTime 的剩余周期次数
- 以 StartTime 为基准计算周期频率,并得到 FinalTime
- 即使中间出现 pause,resume 以后保持 FinalTime 时间不变
withMisfireHandlingInstructionNowWithExistingCount
- 以当前时间为触发频率立即触发执行
- 执行至 FinalTime 的剩余周期次数
- 以调度或恢复调度的时刻为基准的周期频率, FinalTime 根据剩余次数和当前时间计算得到
- 调整后的 FinalTime 会略大于根据 StartTime 计算的到的 FinalTime 值
withMisfireHandlingInstructionNextWithRemainingCount
- 不触发立即执行
- 等待下次触发频率周期时刻,执行至 FinalTime 的剩余周期次数
- 以 StartTime 为基准计算周期频率,并得到 FinalTime
- 即使中间出现 pause,resume 以后保持 FinalTime 时间不变
withMisfireHandlingInstructionNowWithRemainingCount
- 以当前时间为触发频率立即触发执行
- 执行至 FinalTime 的剩余周期次数
- 以调度或恢复调度的时刻为基准的周期频率, FinalTime 根据剩余次数和当前时间计算得到
- 调整后的 FinalTime 会略大于根据 StartTime 计算的到的 FinalTime 值
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT
- 此指令导致 trigger 忘记原始设置的 StartTime 和 repeat-count
- 触发器的 repeat-count 将被设置为剩余的次数
- 这样会导致后面无法获得原始设定的 StartTime 和 repeat-count 值
示例代码
/**
* 创建定时任务
*/
public static void createScheduleJob(Scheduler scheduler, Job scheduleJob) {
try {
// 构建job信息
JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class)
.withIdentity(getJobKey(scheduleJob.getJobId()))
.build();
// 表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
.cronSchedule(scheduleJob.getCronExpression())
.withMisfireHandlingInstructionDoNothing();
// 按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity(getTriggerKey(scheduleJob.getJobId()))
.withSchedule(scheduleBuilder).build();
// 放入参数,运行时的方法可以获取
jobDetail.getJobDataMap().put(Job.JOB_PARAM_KEY, scheduleJob);
scheduler.scheduleJob(jobDetail, trigger);
// 暂停任务
if (scheduleJob.getStatus().equals(Job.ScheduleStatus.PAUSE.getValue())) {
pauseJob(scheduler, scheduleJob.getJobId());
}
} catch (SchedulerException e) {
log.error("创建定时任务失败", e);
}
}
原文:https://www.cnblogs.com/mumian2/p/10735206.html