• 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秒即可。
    而且一般情况下都是多线程执行定时任务,不会因为定时任务阻塞产生错失策略。不需要关心这个参数设置
     
  • 相关阅读:
    策略模式
    简单工厂模式
    单例模式
    sp_xml_preparedocument _使用 处理XML文档
    LINQ to XML
    动态Linq(结合反射)
    IEqualityComparer<T>接口
    Linq to object 技巧、用法集锦
    IComparer<T> 接口Linq比较接口
    Linq to BBJECT之非延时标准查询操作符
  • 原文地址:https://www.cnblogs.com/gne-hwz/p/10371534.html
Copyright © 2020-2023  润新知