配置定時任務參數
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秒即可。
而且一般情況下都是多線程執行定時任務,不會因為定時任務阻塞產生錯失策略。不需要關心這個參數設置