Quartz misfire详解

2023-11-16

一、前言

最近在学习Quartz,看到misfire这一部分,发现官方文档上讲解的很简单,没有看明白,然后去搜索了一下网上的讲解,发现讲的也都大同小异,也没有看明白,最后只能自己动手做测试,总结了一下。这篇文章把自己总结的记录下来,方便自己以后回顾,同时也分享给大家,方便大家能快速理解Quartz的misfire策略。

misfire产生需要有2个前置条件,一个是job到达触发时间时没有被执行,二是被执行的延迟时间超过了Quartz配置的misfireThreshold阀值。如果延迟执行的时间小于阀值,则Quartz不认为发生了misfire,立即执行job;如果延迟执行的时间大于或者等于阀值,则被判断为misfire,然后会按照指定的策略来执行。

例如:没有配置Quartz的misfireThreshold,此时使用Quartz的默认misfireThreshold配置为60秒(misfireThreshold是可以进行配置的),设置一个job在上午8点执行,由于一些原因job在8点没有执行,分为两种情况:
第一种情况是在8点00分50秒Quartz有资源来执行这个job,此时的延迟执行时间是50秒,小于misfireThreshold为60秒的阀值,则Quartz认为该job没有发生misfire,立即执行job。
第二种情况是在8点10分00秒Quartz有资源来执行这个job,此时延迟执行时间是600秒,大于misfireThreshold为60秒的阀值,则Quartz认为该job发生了misfire,会根据指定的misfire策略来执行。

二、misfire产生的原因

我总结的产生misfire的原因有以下4点:
1、当job达到触发时间时,所有线程都被其他job占用,没有可用线程。
2、在job需要触发的时间点,scheduler停止了(可能是意外停止的)。
3、job使用了@DisallowConcurrentExecution注解,job不能并发执行,当达到下一个job执行点的时候,上一个任务还没有完成。
4、job指定了过去的开始执行时间,例如当前时间是8点00分00秒,指定开始时间为7点00分00秒。

三、misfire策略

这里从SimpleTrigger和CronTrigger两个维度来说明。注意:在不指定misfire策略的情况下,Quartz会使用默认的MISFIRE_INSTRUCTION_SMART_POLICY策略。

3.1、SimpleTrigger

这里分为三种情况,第一是只执行一次的job,第二是固定次数执行的job,第三是无限次数执行的job。
为了方便快速产生misfire,设置misfireThreshold为1秒。

3.1.1、只执行一次的job

设置job只执行一次,开始时间设置设置为当前时间的前10秒,代码片段如下:
        JobDetail job = JobBuilder.newJob(MisfireJob.class)
                .withIdentity("job", "g1")
                .build();
        Date next = DateUtils.addSeconds(new Date(), -10);
        SimpleTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger", "g1")
                .startAt(next)
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withMisfireHandlingInstructionFireNow()/*可以指定为任意一个可用的misfire策略*/)
                .build();
        scheduler.scheduleJob(job, trigger);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Quartz misfire详解 的相关文章

随机推荐

  • 写一个段Java 代码,可以实现 多表级联修改

    下面是一个简单的 Java 代码示例 实现了多表的级联修改 import java sql Connection import java sql DriverManager import java sql PreparedStatement
  • 2022国赛12:神州路由器交换机配置BGP实例2

    路由器和交换机参数设置 设备 Vlan 端口 IP地址 R1
  • Python Pygame制作简单五子棋游戏(详细代码+解释)

    这里只想简单演示下一个简单的五子棋界面和落子等操作 主要为了后面设计AI对战方便演示 AI算法后面设计吧 最近事太多了 希望本文有助于你制作自己期望的简单的五子棋 一 pygame初始化画布界面 调用pygame库 import pygam
  • 记Mysql ES 数据一致性问题及方案

    业务中使用了mysql和ElasticSearch Mysql作为主仓库 ES作为索引 实际上包含了接近全集的数据 问题 Mysql和Es未做事务 出现了并非场景下 A线程从MySql读 写到ES B线程从mysql ES删除 结果是最终E
  • 一种相位编码信号多普勒补偿方法的Matlab仿真

    参考文献 http d wanfangdata com cn periodical hkldjs200901007 在相位编码信号脉冲压缩技术中 存在着多普勒频率敏感性问题 需要对多普勒频率进行补偿 本文在分析多普勒敏感性原因的基础上 提出
  • mybatis foreach Mapped Statements collection does not contain

    id collection就是集合 open 以某种字符开始 close 以某种字符结尾 index 遍历的索引 item 集合中的每一项 separator 以某种字符分隔 在使用foreach的时候最关键的也是最容易出错的就是colle
  • 升级 Node.js 版本的步骤

    node 已经成为前端开发 分不开的工具了 但node的使用除了npm i 等命令 还是有很多不清楚 不常用的 特别是新手 可能经常遇到这样的问题 问题一 明明我的命令是按照前端教的输入的 为什么启动不了我的项目 问题二 我要负责好几个项目
  • route add添加静态路由

    方法一 添加路由 route add net 192 168 0 0 24 gw 192 168 0 1 route add host 192 168 1 1 dev 192 168 0 1 删除路由 route del net 192 1
  • java map获取第一个值_HashMap在Java中怎么工作

    前言 大多数JAVA开发人员都在使用Maps 尤其是HashMaps HashMap是一种简单并且有效的存取数据的方式 但是有多少人知道HashMap内部是如何工作的么 前段时间 为了深入理解这个基础的数据结构 我阅读了 java util
  • 新手小白idea的配置2.1.1讲

    3 IDEA配置 idea的jdk的配置 打开IDEA集成开发环境工具 点击 File Project Structure 如下图 在打开的页面中 选择SDKs属性 并点击中间的加号 选择JDK 如下图 在打开的页面中 选择本地计算机中已经
  • 数据分析理论

    文章目录 一 数据分析的概念 二 数据分析的过程 1 问题定义 2 数据采集 3 数据预处理 4 数据探索和数据可视化 5 预测模型的创建和选择 6 模型评估 7 部署 三 数据分析的作用 一 数据分析的概念 数据分析是指用适当的统计分析方
  • Uniapp 截图或者生成海报的方法

    需求 uniapp移动端需要生成一张当前界面的海报 方案一 类似于手机按钮截图效果 实现代码如下 doSaveScreen let this this uni showLoading 加载框 title 保存中 mask true var
  • STM32F103C8T6详细引脚表

    今天准备画一个STM32F103C8T6的最小系统板 就去STM32F103C8的数据手册查看了一下相应的引脚 因为数据手册里面的引脚表有中容量的多种封装描述 看上去比较麻烦 我就单独做了一个LQFP48脚的引脚表 方便后期自己画封装 就图
  • Spring+Mybatis 查询所有数据时发生异常:org.apache.ibatis.reflection.ReflectionException: There is no getter for

    Spring Mybatis框架整合时 根据条件查询数据 发生异常 Caused by org apache ibatis reflection ReflectionException There is no getter for prop
  • JavaScript分支语句总结

    注 js变量算术运算符和逻辑运算符知识点的补充 1 的区别 表示值相等 表示值相等 数据类型也必须相等 案例 的区别 表示值相等 表示值相等 数据类型也必须相等 var x 10 var y 10 console log x y true
  • 图像降质

    1 逆滤波和维纳滤波 附Matlab完整代码 https blog csdn net weixin 41730407 article details 80455612 2 python 运动模糊 退化模型 点扩散函数 逆滤波与维纳滤波 ht
  • GG-CNN代码学习

    文章目录 1 源码网址 https github com dougsm ggcnn 2 数据集格式转化 下载后的康奈尔数据集 解压完之后里面的格式 里面的 tiff图像通过 txt文件转化得到 python m utils dataset
  • layui 数据表格 sort排序,filter过滤——soulTable

    1 效果图 2 页面代码 div class fp table style margin left 0 5 width 86 table style margin bottom 0px table div 3 js代码 引入扩展组件 lay
  • 【学vue跟玩一样】快速搞懂vue渲染

    Vue的渲染分为条件渲染和列表渲染 那究竟什么式渲染呢 1 条件渲染 1 v if写法 1 v if 表达式 2 v else if 表达式 3 v else 表达式 和我们曾经学过的JavaScript里面的if语句几乎一样 适用于 切换
  • Quartz misfire详解

    一 前言 最近在学习Quartz 看到misfire这一部分 发现官方文档上讲解的很简单 没有看明白 然后去搜索了一下网上的讲解 发现讲的也都大同小异 也没有看明白 最后只能自己动手做测试 总结了一下 这篇文章把自己总结的记录下来 方便自己