使用quartz过程中,产生了很多问题,遇到就记录一下,虽然用的比较少了,但还是有一些项目在使用。
问题描述:创建一个每天执行的任务test1,创建自动运行状态,然后停止任务,一直等到当天定时时间过去,然后再启动,发现定时任务还是先执行了一次,目前这个与要实现的效果有点不相符,查找半天才发现这个Misfire
不同的misfire对应的处理规则:
CronTrigger
withMisfireHandlingInstructionDoNothing
——不触发立即执行
——等待下次Cron触发频率到达时刻开始按照Cron频率依次执行
withMisfireHandlingInstructionIgnoreMisfires
——以错过的第一个频率时间立刻开始执行
——重做错过的所有频率周期后
——当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行
withMisfireHandlingInstructionFireAndProceed
——以当前时间为触发频率立刻触发一次执行
——然后按照Cron频率依次执行
部分栗子:
// 启动调度器
scheduler.start();
//失效时间
DateTime endTime = DateTimeKit.parseDateTime(ToolUtil.isEmpty(quartz.getLoseTime()) ? DateTimeKit.now() : quartz.getLoseTime());
// 构建job信息
JobDetail jobDetail = JobBuilder.newJob(JobAndTriggerImpl.getClass(quartz.getJobClassName()).getClass())
.withIdentity(quartz.getJobName(), quartz.getJobGroup()).withDescription(quartz.getDescription()).build();
log.info("jobDetail数据:--------"+jobDetail.toString());
// 表达式调度构建器(即任务执行的时间)
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartz.getCronExpression()).withMisfireHandlingInstructionDoNothing();
// 按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = (CronTrigger)TriggerBuilder.newTrigger().withIdentity(quartz.getJobName(), quartz.getJobGroup()).endAt(endTime)
.withSchedule(scheduleBuilder).build();
其中,用了withMisfireHandlingInstructionDoNothing规则执行了定时任务,暂未发现再次执行的情况。。。