使用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規則執行了定時任務,暫未發現再次執行的情況。。。