quartz配置參數org.quartz.jobStore.misfireThreshold含義解釋


配置定時任務參數
quartz.properties文件時
需要配置jobStore的超過時間數
默認為60秒(這里單位為毫秒)
org.quartz.jobStore.misfireThreshold = 60000
這個參數一般在多線程池條件下無效。
 
產生misfire失敗的條件:
單線程執行定時任務
第一個任務的執行完后的結束時間 減去 第二個任務的開始時間 = 時間間隔
時間間隔 大於 60s時, 第二個任務不會被執行。
這個叫做失敗臨界值,或者臨界時間
 
例如
設置quartz.properties
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 1
org.quartz.threadPool.threadPriority: 5
設置臨界時間為6秒
org.quartz.jobStore.misfireThreshold: 6000
 
設置任務每個5秒執行一次job.properties
job.xxx.class=com.uelink.dkapi.job.RemindJob
job.xxx.group=default
job.xxx.id=1
job.xxx.cron=*/5 * * * * ?
job.xxx.enable=true
注意:xxx表示名字隨意取
 
在定時任務中編寫延遲RemindJob.java
休眠10秒,相當於任務執行時間為10s
public class RemindJob implements Job{
 
      @Override
      public void execute(JobExecutionContext context) throws JobExecutionException {
            System.out.println("微信小程序定時提醒通知開始");
            DateFormat df = new SimpleDateFormat("hh:mm:ss");
              System.err.println("[" + Thread.currentThread().getName() + "] Now: "
                + df.format(context.getFireTime()) + " Scheduled: "
                + df.format(context.getScheduledFireTime()) + " Previous: "
                + df.format(context.getPreviousFireTime()) + " Next: "
                + df.format(context.getNextFireTime()));
            try {
                  Thread.sleep(10 * 1000);
 
            } catch (InterruptedException e) {
                  e.printStackTrace();
            }
            System.err.println("線程休眠結束時間:"+df.format(new Date(System.currentTimeMillis())));
      }
 
}

 

 
產生錯失情況
條件
org.quartz.jobStore.misfireThreshold時間6秒
每隔5秒執行一次,
一次執行10秒
 
結果為
Now: 06:22:20 Scheduled: 06:22:20 Previous: 06:22:15 Next: 06:22:25
 
Now: 06:22:30 Scheduled: 06:22:25 Previous: 06:22:20 Next: 06:22:30
 
Now: 06:22:40 Scheduled: 06:22:40 Previous: 06:22:25 Next: 06:22:45
 
Now: 06:22:50 Scheduled: 06:22:45 Previous: 06:22:40 Next: 06:22:50
 
Now: 06:23:00 Scheduled: 06:23:00 Previous: 06:22:45 Next: 06:23:05
查看上面的Scheduled,是定時任務原本執行的時間。
第一個22:20, 第二個22:25, 第三個22:30, 第四個22:35,第五個22:40,第六個22:45,第七個22:50
第二個
30-25=5<6,認為沒有產生錯失。執行第二個
第三個25到40
40-30>6 ,產生錯失,不執行第三個。
第四個原本是35,不知道是不是因為第三個發生錯失后,小於40的任務都不執行,第四個被略過。
22:40直接執行第五個
 
第六個
40-45=5<6 ,沒有措施,執行第六個
第七個22:50,
23:00-22:50=10>6產生錯失,第六個不執行,第七個22:55不執行
第八個執行
 
 
當我們設置臨界時間為60秒時。
條件
org.quartz.jobStore.misfireThreshold時間60秒
每隔5秒執行一次,
一次執行10秒
 
結果
Now: 06:05:25 Scheduled: 06:05:25 Previous: 06:05:20 Next: 06:05:30
 
Now: 06:05:35 Scheduled: 06:05:30 Previous: 06:05:25 Next: 06:05:35
 
Now: 06:05:45 Scheduled: 06:05:35 Previous: 06:05:30 Next: 06:05:40
 
Now: 06:05:55 Scheduled: 06:05:40 Previous: 06:05:35 Next: 06:05:45
 
Now: 06:06:05 Scheduled: 06:05:45 Previous: 06:05:40 Next: 06:05:50
所有的定時任務都會被執行,知道超出臨界時間為止
第一次任務原本開始時間和任務真正開始時間差為0
第二次5
第三次10
第四次15
需要在13次才能達到60,才會產生錯失情況。
 
 
如果我們每隔一天才執行一次時,由於任務執行時間遠遠小於兩次任務的時間間隔,不會產生錯失情況,不需要擔心定時任務沒有執行的意外。只需要設置這個臨界時間為60秒即可。
而且一般情況下都是多線程執行定時任務,不會因為定時任務阻塞產生錯失策略。不需要關心這個參數設置
 


免責聲明!

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



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