quartz對於定時任務Misfire的處理

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章