Quartz錯過任務執行時間的處理機制(Misfire處理規則 )


調度(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
——即使中間出現pause,resume以后保持FinalTime時間不變


withMisfireHandlingInstructionNowWithExistingCount
——以當前時間為觸發頻率立即觸發執行
——執行至FinalTIme的剩余周期次數
——以調度或恢復調度的時刻為基准的周期頻率,FinalTime根據剩余次數和當前時間計算得到
——調整后的FinalTime會略大於根據starttime計算的到的FinalTime值

withMisfireHandlingInstructionNextWithRemainingCount
——不觸發立即執行
——等待下次觸發頻率周期時刻,執行至FinalTime的剩余周期次數
——以startTime為基准計算周期頻率,並得到FinalTime
——即使中間出現pause,resume以后保持FinalTime時間不變

withMisfireHandlingInstructionNowWithRemainingCount
——以當前時間為觸發頻率立即觸發執行
——執行至FinalTIme的剩余周期次數
——以調度或恢復調度的時刻為基准的周期頻率,FinalTime根據剩余次數和當前時間計算得到

——調整后的FinalTime會略大於根據starttime計算的到的FinalTime值

MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT
——此指令導致trigger忘記原始設置的starttime和repeat-count
——觸發器的repeat-count將被設置為剩余的次數
——這樣會導致后面無法獲得原始設定的starttime和repeat-count值

 

設置觸發器的錯誤策略

  /**
     * 創建定時任務
     */
    public static void createScheduleJob(Scheduler scheduler, SysJob job) {
        try {
            //構建job信息
            JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(job.getJobId())).build();
            //表達式調度構建器
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
            cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder);

            //按新的cronExpression表達式構建一個新的trigger
            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(job.getJobId()))
                    .withSchedule(cronScheduleBuilder).build();

            //放入參數,運行時的方法可以獲取
            jobDetail.getJobDataMap().put(ScheduleJobConstant.TASK_PROPERTIES, job);
            //執行器添加 定時任務(自動存入數據庫)
            scheduler.scheduleJob(jobDetail, trigger);
            //暫停任務
            if (job.getStatus().equals(ScheduleJobConstant.Status.PAUSE.getValue())) {
                pauseJob(scheduler, job.getJobId());
            }
        } catch (Exception e) {
            log.error("createScheduleJob 異常:", e);
        }
    }

  /**
     * 表達式與觸發器構建
     * @param job
     * @param cb
     * @return
     * @throws Exception
     */
    public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb)
            throws Exception {
        switch (job.getMisfirePolicy()) {
            case ScheduleJobConstant.MISFIRE_DEFAULT:
                return cb;
            case ScheduleJobConstant.MISFIRE_IGNORE_MISFIRES:
                //不觸發立即執行
                //——等待下次Cron觸發頻率到達時刻開始按照Cron頻率依次執行
                return cb.withMisfireHandlingInstructionIgnoreMisfires();
            case ScheduleJobConstant.MISFIRE_FIRE_AND_PROCEED:
                //以錯過的第一個頻率時間立刻開始執行
                //——重做錯過的所有頻率周期后
                //——當下一次觸發頻率發生時間大於當前時間后,再按照正常的Cron頻率依次執行
                return cb.withMisfireHandlingInstructionFireAndProceed();
            case ScheduleJobConstant.MISFIRE_DO_NOTHING:
                // 不觸發立即執行
                // 等待下次Cron觸發頻率到達時刻開始按照Cron頻率依次執行
                return cb.withMisfireHandlingInstructionDoNothing();
            default:
                throw new Exception("The task misfire policy '" + job.getMisfirePolicy() + "' cannot be used in cron schedule tasks");
        }
    }  

 

部分內容摘錄自:

https://blog.csdn.net/yangshangwei/article/details/78539433

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM