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秒即可。 而且一般情况下都是多线程执行定时任务,不会因为定时任务阻塞产生错失策略。不需要关心这个参数设置  
上一篇:【Linux入门到精通系列讲解】Ubuntu下使用gcc编译并运行C程序


下一篇:Hello1 web.xml解析