Quartz的MisFire机制解析

2023-10-27

    在上一篇《Quartz的负载均衡如何实现》文章中说过Quartz的线程模型,提到了MisFire任务是由MisfireHandler线程专门进行处理的,本文主要是来了解下该部分功能是如何实现的。

 

源码分析:

    MisfireHandler线程定义在JobStoreSupport类中,在初始化的时候会将自己注册到线程池中:

public void initialize() {
    ThreadExecutor executor = getThreadExecutor();
    executor.execute(MisfireHandler.this);
}

 

来看下它的run()方法:

主要分成三步:

  1. 获取Misfire的trigger
  2. 通知QuartzSchedulerThread触发这些trigger的执行
  3. sleep一段时间,目的是At least a short pause to help balance threads(暂时不太理解这句话的含义)

 

来分析下如何获取Misfire的trigger,核心是manager()方法中的doRecoverMisfires():

    countMisfiredTriggersInState()用于查看是否确实存在Misfire的job,避免数据库加锁这一操作。Misfire判断依据是:status = WAITING, next_fire_time < current_time - misfirethreshold(可配置,默认1min)。即默认情况下,如果超过了Trigger本应触发时间60s,这次Trigger便不会再进行恢复了!

    但是如果确实存在Misfire的job,则会调用recoverMisfiredJobs()方法中的doUpdateOfMisfiredTrigger()方法修改Misfire Trigger的next fired time ,然后通知任务选取线程去调度,对这些Trigger进行恢复,默认情况一次最多同时恢复20个Trigger(maxToRecoverAtATime参数控制)。

    核心是updateAfterMisfire()方法,内部根据程序选取的Misfire策略设置Trigger的setNextFireTime(cal)进行恢复,本文接下来会说明一些Misfire策略。

 

触发trigger执行的代码逻辑就比较简单了:

if (recoverMisfiredJobsResult.getProcessedMisfiredTriggerCount() > 0) {

    signalSchedulingChangeImmediately(recoverMisfiredJobsResult.getEarliestNewTime());

}

内部通过sigLock.notifyall(),唤醒QuartzSchedulerThread线程调度执行任务:

 

 

常用的MisFire策略:

介绍下SimpleScheduler一些常用的Misfire策略:

 

withMisfireHandlingInstructionIgnoreMisfires

所有MisFire的Trigger会马上执行

 

withMisfireHandlingInstructionFireNow(默认)

立即执行Trigger,该策略适用于只执行一次的Trigger

 

withMisfireHandlingInstructionNextWithExistingCount

下一次Trigger时间到的时候执行任务,总次数不变

 

withMisfireHandlingInstructionNextWithRemainingCount(默认)

下一次Trigger时间到的时候执行任务,起始次数清零,重新开始执行

 

withMisfireHandlingInstructionNowWithExistingCount(默认)

立即执行Trigger,循环开始周期以当前时间为基准,总次数不变

 

withMisfireHandlingInstructionNowWithRemainingCount

立即执行Trigger,循环开始周期以当前时间为基准,起始次数清零,重新开始执行

 

 

默认情况下,Quartz的Scheduler会根据Trigger的触发次数来选择不同的MisFire策略:

 

 

 

 

 

参考:

    https://www.cnblogs.com/skyLogin/p/6927629.html(Misfire策略)

    https://www.jianshu.com/p/6afa510fa2ff(Quartz源码阅读)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Quartz的MisFire机制解析 的相关文章

  • 百度群组链接分享 - 铁人圈子

    百度网盘群组链接分享 铁人圈子 铁人圈子 tierenpan com 是一个分享百度网盘群组的发布平台 可以在铁人圈子上实时分享你的群组链接 并且和其他网友互动交流分享资源 群组分享 百度群组链接分享 地址 https www tieren
  • shape文件格式简单说明

    一 简介 ShapeFile是Esri开发的一种空间数据格式 她是一种矢量数据存储格式 通常用于描述几何体形状 点 线 面 及相关属性 二 组成说明 2 1 必须文件 shp 图形格式 用于描述几何体形状 shx 图形索引格式 记录每一个几
  • 一文带你彻底搞懂二叉树(Python实现)——真香

    文章目录 前言 树 树中的一些术语 树的分类 树的存储表示 二叉树 二叉树的性质 二叉树的实现 二叉树结点的实现 二叉树的创建 广度优先遍历 先序 中序 后序遍历 后记 前言 终于到了数据结构中的关键部分了 二叉树 说起二叉树啊 简直是我当
  • PTA 浙大版《C语言程序设计(第4版)》题目集 习题4-6 水仙花数

    原题链接 问题描述 水仙花数是指一个N位正整数 N 3 它的每个位上的数字的N次幂之和等于它本身 例如 153 13 53 33 本题要求编写程序 计算所有N位水仙花数 输入格式 输入在一行中给出一个正整数N 3 N 7 输出格式 按递增顺
  • abp Application层获取请求的Header内容

    abp 如何在应用层返回header自定义的内容 参考 https blog csdn net u012659600 article details 99579369 首先在AppService中注入HttpContextAccessor
  • Ubuntu 更新 CMake 版本

    项目中有时候会出现CMake版本小于最低要求的情况 实际上没有有必要这么高的要求 但是在不能改对方代码的情况下 只能去升级自身的版本了 尝试了网上说的直接update之后再次安装的方式 结果版本号没有改变 sudo apt get upda
  • css文字超出隐藏显示...

    单行 overflow hidden white space nowrap text overflow ellipsis 多行 display webkit box webkit box orient vertical webkit lin
  • Windows10开启Hyper-v并安装Linux CentOS虚拟机

    Windows10开启Hyper v虚拟机配置静态网络 1 Windows10 开启Hyper v 右键单击 Windows 按钮并选择 应用和功能 选择相关设置下右侧的 程序和功能 选择 打开或关闭 Windows 功能 选择 Hyper
  • Element 标签页样式修改

    deep el tabs nav wrap after height 1px deep el tabs item height 50px font size 16px font family PingFang SC font weight
  • Java编程实现Softmax函数功能

    Java编程实现Softmax函数功能 Softmax函数是一种常用的数学函数 广泛应用于机器学习和深度学习领域 尤其在分类问题中起到重要作用 本文将介绍如何使用Java编程实现Softmax函数 并提供相应的源代码 首先 我们来了解一下S
  • centos7启动docker: dial tcp 104.18.123.25:443: i/o timeout.

    在centos7上安装好了docker之后 测试docker是否安装成功 使用官方给出的sudo docker run hello world 解决 再运行一遍命令即可
  • 自定义 scrollview 标头部分的滑动速度慢(scrollview 子控件滑动速度不一致)

    scrollview 子控件滑动速度不一致 先来个布局图 向上滑动时 图片向上划出的速度较下面的蓝色view慢 现在我们先来看布局文件
  • 基于tensorflow的手势检测和手势识别分类

    项目目的 在手机端实现用户手势的检测并且识别用户所做的手势 遇到的问题 首先在手部检测的解决办法中 我尝试过用opencv进行手部识别 但存在的问题是背景对手的识别的影响太大 如果采用颜色进行手和背景的区分的话 又会受到光照等影响 总体而言
  • 【机器学习实战】决策树 python代码实现

    typora copy images to upload 第三章 决策树 3 1决策树的构造 优点 计算复杂度不高 输出结果易于理解 对中间值的缺失不敏感 可以处理不相关的特征数据 缺点 可能会产生过度匹配的问题 适用数据类型 数据型和标称
  • 弱网的概念以及弱网测试

    什么是弱网测试 在当今移动互联网盛行的时代 网络的形态除了有线连接 还有2G 3G Edge 4G Wifi等多种手机网络连接方式 不同的协议 不同的制式 不同的速率 使移动应用运行的场景更加丰富 从测试角度来说 需要额外关注的场景就远不止
  • SpringBoot日志配置【详解】

    文章目录 前言 1 为什么使用Logback 2 Logback使用 2 1 添加依赖 2 2 默认配置 3 logback spring xml详解 3 1 configuration元素 3 2 logger 元素 3 3 root 元
  • 购物商城---页面缓存oscached

    流程图 web xml
  • VC++使用HOOK API 屏蔽PrintScreen键截屏以及QQ和微信默认热键截屏

    转载 http blog csdn net easysec article details 8833457 转载 http www vckbase com module articleContent php id 567 title 用VS

随机推荐

  • 离线安装Docker镜像

    部分线上服务器无法连接公网 或者服务器下载镜像比较慢 遇到这种情况要怎么解决 我们可以在联网的本机或服务器上 将已经下载好的镜像导出 然后导入到没有网络的服务器上 通过Docker加载 例如 这里有一个镜像grafana loki 2 2
  • 订单系统开发

    一 订单系统基本框架的搭建 1 创建maven工程 pom xml文件内容如下
  • WSA with Magisk Root安装配置教程(2023.5)

    前言 最近正式走上了安卓逆向的道路 刚开始尝试了各种模拟器 雷电 夜神 及其海外版 并且安装配置了多次magisk 倒不是说这些模拟器的体验有多差 主要还是不能与 Windows Hype V 共存导致无法使用 WSL 这点让我无法接受 s
  • markdown语法最全汇总

    一 markdown简介 注 如果对markdown有一定了解 可以略过此处 第一章主要对markdown基础知识做个补充 摘自菜鸟教程此处原文档 博客原地址 欢迎收藏访问 1 1 markdown背景 1 markdown是一种轻量级标记
  • 一枚芯片的实际成本是多少?(1)

    芯片的硬件成本构成 芯片的成本包括芯片的硬件成本和芯片的设计成本 芯片硬件成本包括晶片成本 掩膜成本 测试成本 封装成本四部分 像ARM阵营的IC设计公司要支付给ARM设计研发费以及每一片芯片的版税 但笔者这里主要描述自主CPU和Intel
  • shiny教程一 -- shiny入门

    Shiny是一个R软件包 可轻松从R直接构建交互式Web应用程序 本课程将使您立即开始构建Shiny应用程序 如果还未安装Shiny软件包 打开R会话窗 确保联网状态 然后运行 install packages shiny Shiny软件包
  • vue 中click.stop的用法

    click stop 阻止点击事件继续传播 场景 在table中使用 点击当前行 当前行被勾选 但是点击当前行中按钮或点击事件时 使用此方法 则在触发当前点击事件后 阻止行的选中事件 使用 html
  • input“输入框”常见问题及解决方法

    1 ios中 输入框获得焦点时 页面输入框被遮盖 定位的元素位置错乱 当页input存在于吸顶或者吸底元素中时 用户点击输入框 输入法弹出后 fiexd失效 页面中定位好的元素随屏幕滚动 针对这个问题 我们一起来看下以下几种方案 方案一 W
  • FOXBORO FBM232 P0926GW 自动化控制模块

    Foxboro FBM232 P0926GW 是 Foxboro 福克斯博罗 自动化控制系统的一部分 通常用于监测和控制工业过程 以下是关于这种类型的自动化控制模块可能具有的一些常见功能 数字输入通道 FBM232 P0926GW 控制模块
  • 鸿蒙系统 服务器,鸿蒙开发之环境准备【1】-基于Deepin20操作系统的编译服务器环境搭建遇到的问题及解决方式...

    Hi3861 code 1 0 python build py wifiiot 196 197 ACTION vendor hisi hi3861 hi3861 run wifiiot scons build lite toolchain
  • vscode launch.json 常用配置

    Use IntelliSense to learn about possible attributes Hover to view descriptions of existing attributes For more informati
  • 毕业设计-基于机器视觉的智能安检系统设计 -OpenCV

    目录 前言 课题背景和意义 实现技术思路 一 智能安检机概述 二 嵌入式控制系统 三 图像处理模块设计 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精
  • Blender石头雕刻

    1 建立一个plane 选中一个点后ctrl I反选其他的点 然后删去 2 e挤出点 3 添加蒙皮skin修改器 4 全选所有点 ctrl a放大或缩小
  • Caffeine缓存不刷新问题

    一 先看问题代码 缓存管理器配置 import java util concurrent TimeUnit import org springframework cache CacheManager import org springfra
  • springboot同一个类里的方法之间调用事务不起作用

    今天在看项目代码的时候 发现在service层 有方法调用同类中的方法 SonarLint提示有bug 下图是我自己做测试时写的demo代码 经过测试发现 当A方法调用同类中带有 Transactional注解的B方法时 被 Transac
  • JVM学习笔记3:内存溢出的十个场景

    内存溢出的十个场景 JVM运行时首先需要类加载器 classLoader 加载所需类的字节码文件 加载完毕交由执行引擎执行 在执行过程中需要一段空间来存储数据 类比CPU与主存 这段内存空间的分配和释放过程正是我们需要关心的运行时数据区 内
  • 常见计算机英语,常见计算机英语词汇

    电脑 又称计算机 是机械的一种 现在使用的越来越多 接下来小编为大家整理了常见计算机英语词汇 希望对你有帮助哦 adder加法器 address地址 access arm磁头臂 存取臂 access time存取时间 alphanumeri
  • Java中的静态成员方法

    用static修饰的变量 方法叫静态成员 方法 属于整个类所有 而不是某个对象所有 即被类的所有对象所共享 静态成员可以使用类名直接访问 也可以使用对象名进行访问 Java中静态方法与非静态方法的区别 首先 两者本质上的区别是 静态方法是在
  • 2021-06-01 通过类去实现装饰器__call__.

    1 含有 init 的类 class MyClass a cherry def init self age sex self age age self sex sex def say self print hello obj MyClass
  • Quartz的MisFire机制解析

    在上一篇 Quartz的负载均衡如何实现 文章中说过Quartz的线程模型 提到了MisFire任务是由MisfireHandler线程专门进行处理的 本文主要是来了解下该部分功能是如何实现的 源码分析 MisfireHandler线程定义