介绍
在 Quartz 中,MisFire(错过触发)是指触发器错过了预定的触发时间,通常是由于系统延迟、任务执行时间过长或者调度器本身未能及时执行任务等原因。这种情况可能会导致任务无法按预期的时间执行。为了应对这些问题,Quartz 提供了 MisFire 补偿机制,即通过设置 MisFire Policy(错过触发策略)来处理这种情况。
Trigger trigger= TriggerBuilder.newTrigger()
.withIdentity(job.getJobName()+"_trigger")
.startAt(DateBuilder.todayAt(20,50,0)) //第一次执行时间
.withSchedule(CronScheduleBuilder.cronSchedule("0 * * * * ?")//每分钟执行一次
.withMisfireHandlingInstructionIgnoreMisfires()) //补偿机制
.build();
scheduler.scheduleJob(jobDetail,trigger);
IgnoreMisfires全部补偿
withMisfireHandlingInstructionIgnoreMisfires会将超过的全部都补偿一遍,如我20:55:00启动项目,将会补偿5次。
.startAt(DateBuilder.todayAt(20,50,0)) //第一次执行时间
.withSchedule(CronScheduleBuilder.cronSchedule("0 * * * * ?")//每分钟执行一次
.withMisfireHandlingInstructionIgnoreMisfires()) //补偿机制
DoNothing 不补偿
withMisfireHandlingInstructionDoNothing会将超过的不做补偿。
.startAt(DateBuilder.todayAt(20,50,0)) //第一次执行时间
.withSchedule(CronScheduleBuilder.cronSchedule("0 * * * * ?")//每分钟执行一次
.withMisfireHandlingInstructionDoNothing()) //补偿机制
FireAndProceed 补偿一次(默认)
withMisfireHandlingInstructionFireAndProceed会将超过只补偿一次,如我20:55:00启动项目,将会补偿1次。
.startAt(DateBuilder.todayAt(20,50,0)) //第一次执行时间
.withSchedule(CronScheduleBuilder.cronSchedule("0 * * * * ?")//每分钟执行一次
.withMisfireHandlingInstructionFireAndProceed()) //补偿机制