配置定时任务参数
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秒即可。
而且一般情况下都是多线程执行定时任务,不会因为定时任务阻塞产生错失策略。不需要关心这个参数设置