【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
  • 即使中间出现 pauseresume 以后保持 FinalTime 时间不变

withMisfireHandlingInstructionNowWithExistingCount

  • 以当前时间为触发频率立即触发执行
  • 执行至 FinalTime 的剩余周期次数
  • 以调度或恢复调度的时刻为基准的周期频率, FinalTime 根据剩余次数和当前时间计算得到
  • 调整后的 FinalTime 会略大于根据 StartTime 计算的到的 FinalTime

withMisfireHandlingInstructionNextWithRemainingCount

  • 不触发立即执行
  • 等待下次触发频率周期时刻,执行至 FinalTime 的剩余周期次数
  • StartTime 为基准计算周期频率,并得到 FinalTime
  • 即使中间出现 pauseresume 以后保持 FinalTime 时间不变

withMisfireHandlingInstructionNowWithRemainingCount

  • 以当前时间为触发频率立即触发执行
  • 执行至 FinalTime 的剩余周期次数
  • 以调度或恢复调度的时刻为基准的周期频率, FinalTime 根据剩余次数和当前时间计算得到
  • 调整后的 FinalTime 会略大于根据 StartTime 计算的到的 FinalTime

MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT

  • 此指令导致 trigger 忘记原始设置的 StartTimerepeat-count
  • 触发器的 repeat-count 将被设置为剩余的次数
  • 这样会导致后面无法获得原始设定的 StartTimerepeat-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