Quartz学习

news2025/1/6 19:19:47

任务执行流程

  1. StdSchedulerFactory创建和属性初始化
    如果自定义了属性,会在这里加载
    在这里插入图片描述
  2. StdScheduler创建
    入口为StdSchedulerFactory#getScheduler();,首次进入时调用StdSchedulerFactory#instantiate
    1. 如果没有配置自定义属性,则先读取默认的quartz.properties文件配置
    2. 创建ClassLoadHelper并初始化
      在这里插入图片描述
    3. 创建JobFactory,默认实现为SimpleJobFactory,用来产生用户自定义的Job接口实现类的实例
    4. 创建ThreadPool,默认实现为org.quartz.simpl.SimpleThreadPool,并将org.quartz.threadPool开头的配置通过反射的方式赋予实例,这就是用来执行定时任务的线程池。
      org.quartz.threadPool.threadCount: 10org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
    5. 初始化JobStore,默认为RAMJobStore,并将org.quartz.jobStore相关配置赋值(如org.quartz.jobStore.misfireThreshold: 60000控制misfire阈值)
    6. 如果有数据源持久化配置,读取前缀为org.quartz.dataSource的进行配置
    7. 如果有SchedulerPlugin插件配置,读取前缀为org.quartz.plugin的进行配置
    8. 如果有JobListener配置,读取前缀为org.quartz.jobListener的进行配置
    9. 如果有TriggerListener配置,读取前缀为org.quartz.triggerListener的进行配置
    10. 创建ThreadExecutor,未配置时默认创建DefaultThreadExecutor ,execute(thread)时直接执行thread#start`
    11. 创建JobRunShellFactory,被用来构建JobRunShell实例
      未开启org.quartz.scheduler.wrapJobExecutionInUserTransaction时,默认创建JTAAnnotationAwareJobRunShellFactory
    12. 创建QuartzSchedulerResources,包装上述组件和一些配置信息
    13. 为ThreadPool#setInstanceName 为配置项org.quartz.scheduler.instanceName: DefaultQuartzScheduler,setInstanceId为org.quartz.scheduler.instanceId:NON_CLUSTERED
    14. SimpleThreadPool#initialize
      1. 创建org.quartz.threadPool.threadCount: 10个实现自Thread的WorkerThread,线程前缀为如DefaultQuartzScheduler_Worker-,则工作线程名为如DefaultQuartzScheduler_Worker-1。最后都放入列表workers
      2. 启动workers中所有WorkerThread,并加入SimpleThreadPool.availWorkers等待派发任务
      3. WorkerThread#run方法会不断循环,尝试执行内部runnable,没有派发的runnable就lock.wait(500)休息500ms;如果有任务,就执行,完成后将本WorkerThread重新加入SimpleThreadPool.availWorkers
    15. 使用上述信息创建QuartzScheduler,可用来注册调度job、JobListener等
      1. 创建并启动QuartzSchedulerThread,初始paused=true,halted=false
      2. QuartzSchedulerThread#run方法,halted==false时,会不断做以下工作:
        1. RAMJobStore#acquireNextTriggers,获取不超过当前时间30秒的、Math.min(availThreadCount, qsRsrcs.getMaxBatchSize())个OperableTrigger。
          具体来说,是从TreeSet<TriggerWrapper> timeTriggers中获取。依次比较nextFireTime越早越优先(trigger在首次scheduler#schedule时会调用computeFirstFireTime存储,以后每次触发就更新)、优先级越大越优先、key字典序排序优先。
        2. 对取出的Trigger计算Misfire规则
          1. misfireTime = now - org.quartz.jobStore.misfireThreshold: 60000
          2. 如果下次nextFireTime==null 或 nextFireTime > misfireTime 或 配置了 MisfireHandlingInstructionIgnoreMisfires,则说明不会misfire
          3. 否则说明会misfire,先通知triggerListeners该trigger发生misfire,然后根据MISFIRE_INSTRUCTION策略按需更新trigger.newFireTime
          4. 最后,如果nextFireTime为null,则说明已经STATE_COMPLETE,通知SchedulerListener,并从timeTriggers移除;否则继续判断newFireTime是否已经被更新,若未更新则表示没有misfire(ignore),否则表示已经更新且当次触发misfire。
        3. 如果trigger触发了mifire且nextFireTime不为null,则更新到timeTriggers
        4. 如果trigger.nextFireTime 超过当前时间30秒的,则加入timeTriggers
        5. 如果Job含有@DisallowConcurrentExecution注解,说明不能并行运行,则该jobKey除了第一个以外的Trigger都放入timeTriggers等待下次触发
        6. 更新可触发的trigger.state=TriggerWrapper.STATE_ACQUIRED
        7. 因为默认的maxBatchSize为1,所以这里就只取这个trigger
      3. 等到trigger.nextFireTime距离now 2ms以内时,就goAhead:RAMJobStore#triggersFired:
        1. 获取prevFireTime
        2. 更新nextFireTime
        3. tw.state = TriggerWrapper.STATE_WAITING;
        4. 将上述信息组装为运行时信息类TriggerFiredBundle
        5. Job含有@DisallowConcurrentExecution注解,则同jobKey的其他trigger变为TriggerWrapper.STATE_BLOCKED,并从timeTriggers移除,放入blockedJobs;否则放入timeTriggers等待下次触发
        6. JobRunShellFactory使用TriggerFiredBundle创建JobRunShell,传入StdCheduler、TriggerFiredBundle,并调用其initialize方法,创建用户自定义Job的实例
        7. threadPool#runInThread(JobRunShell),使用一个可用WorkerThread来运行JobRunShell

更多好文

  • 阅读源码——Quartz源码分析之任务存储
  • 阅读源码——Quartz源码分析之任务调度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022年企业数字化技术应用 5 大趋势丨三叠云

根据易观分析发布的相关报告&#xff0c;本期视频将对2022年企业数字化技术应用 5 大趋势进行讲解&#xff0c;内容可能比较硬核&#xff0c;值得你先收藏再观看。 趋势一&#xff1a;武装数字员工“RPA低代码AI” 中国市场技术供应商正在快速推动技术民主化进程&#xff0c;其…

并发编程(二)有序性

【问题的产生】&#xff1a; 程序真的是按照顺序执行的吗&#xff1f; /*** 本程序跟可见性无关&#xff0c;曾经有同学用单核也发现了这一点*/import java.util.concurrent.CountDownLatch;public class T01_Disorder {private static int x 0, y 0;private static int a …

java小技能:集成开发工具(IDE)

文章目录 I IDEA1.1 下载1.2 试用II 忽略IntelliJ IDEA 文件2.1 .gitignore的例子2.2 从idea进行忽略III idea使用非模式提交界面IV DataGrip4.1安装4.2 Actsee alsoI IDEA 1.1 下载 https://www.jetbrains.com/zh-cn/idea/download/other.html 1.2 试用 IntelliJ IDEA 2021…

快手如何玩转复杂场景下的说话人识别?| ASRU 2021

快手是一个短视频社区&#xff0c;短视频和直播中通常混合各种形式的声音&#xff0c;如语音、音乐、特效音和背景噪声等&#xff0c;这些声音很好的提升了短视频和直播的用户消费体验&#xff0c;但同时也为音频内容理解带来极大的困难和挑战。如何在复杂场景下准确高效的进行…

AMS的启动

AMS的启动 Launcher请求AMS阶段 AMS到ApplicationThread阶段 ApplicationThread到Activity阶段 API28重构之后&#xff0c;ApplicationThread到Activity阶段 应用程序启动涉及的进程间通信 根Activity启动过程涉及到的进程之间的关系 根Activity启动过程中的进程调用时序图 A…

HTML期末大作业:基于HTML+CSS+JavaScript新能源汽车资讯门户网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

兼容模式怎么设置?5个常用浏览器的设置方法

在使用电脑浏览器时&#xff0c;有时需要切换到兼容模式才能打开相应界面。许多浏览器现在都有自己的防病毒功能&#xff0c;这可能会直接将许多组件作为病毒屏蔽&#xff0c;导致某些元素无法在正常模式下显示。但是常用浏览器的兼容模式怎么设置呢&#xff1f;接下来让我们一…

【附源码】计算机毕业设计JAVA研究生入学考试备考辅助系统

【附源码】计算机毕业设计JAVA研究生入学考试备考辅助系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a;…

网络编程——socket定义和地址格式

网络编程——socket定义和地址格式 目录 socket 是什么&#xff1f;套接字地址格式 1. socket 是什么&#xff1f; 网络编程中&#xff0c; socket 翻译为套接字或套接口&#xff0c;指可以通过插口接入的方式&#xff0c;快速完成网络连接和数据收发。上图表示网络编程中&…

智能终端测试解决方案

概述 随着互联网产业的蓬勃发展&#xff0c;智能终端的崛起&#xff0c;无论是移动终端制造商、移动通信运营商以及移动互联网内容服务商&#xff0c;都面临着新技术、新业务、新服务不断涌现&#xff0c;商用进程不断加快的局面。 当前基于5G核心技术的移动传输网络已开发出…

只因简历上有“精通”Redis,阿里三面被面试官狂问 Redis,再也不敢乱写了

Redis 在国内各大公司都很热门&#xff0c;比如新浪、阿里、腾讯、百度、美团、小米等。Redis 也是大厂面试最爱问的&#xff0c;尤其是 Redis 客户端、Redis 高级功能、Redis 持久化和开发运维常用问题探讨、Redis 复制的原理和优化策略、Redis 分布式解决方案等。 Redis 我们…

Python 字符串详解

一、字符串概念 用于保存字符信息的数据模型(容器)。 1、只能存放一个值 2、不可变类型 3、有序&#xff0c;索引从0开始顺序访问 字符串语法格式&#xff1a; str1 “字符串信息” str2 字符串信息 str3 字符串信息 str4 字符串信息 二、字符串常用操作 1、字符串…

【论文阅读】社交网络传播最大化问题-02

Leader-Based Community Detection Algorithmin Attributed Networks以往leader-aware算法创新点问题定义定义基础概念定义创新概念模型构造第一步&#xff1a;确定每个节点的leader第二步&#xff1a;合并小分支以得到最终结果实验数据集人工合成网络现实世界的网络基线方法和…

leetcode:2478. 完美分割的方案数【预处理 + dp定义 + 前缀和优化】

目录题目截图题目分析ac code总结题目截图 题目分析 开头必定是prime&#xff0c;结尾必定是not primek 1特判找到所有可能的结尾点&#xff08;最后一个不考虑&#xff09;结尾点i必须满足s[i]->not prime, s[i 1]->prime设结尾点集合为x0 < x1 < x2 < … &…

Docker的容器管理

1、创建容器 容器创建&#xff1a;就是将镜像加载到容器的过程。 创建容器时如果没有指定容器名称&#xff0c;系统会自动创建一个名称。 新创建的容器默认处于停止状态&#xff0c;不运行任何程序&#xff0c;需要在其中发起一个进程来启动容器。 docker create创建的容器…

MCE | ROS 与疾病的关系

前段时间&#xff0c;一篇刊登在国际杂志 Cell Metabolism 上的研究报告表明&#xff0c;从表型正常的细胞转化为癌变细胞或许涉及抗氧化剂防御 (Antioxidant defense) 和核苷酸合成 (Nucleotide synthesis) 两个部分&#xff0c;而突破这些限制可能是致癌转化的关键。文中通过…

oracle常见报错问题处理

文章目录协议适配器错误怎么办&#xff1f;忘记密码了怎么办&#xff1f;报错:ora-01033oracle initialization or shutdown in progress&#xff1b;edit无法使用怎么办&#xff1f;报错:ORA-28547:connection to server failed,probable Oracle Net admin errorORA-12505:监听…

大一学生HTML期末作业_ 季奥林匹克运动会 8页 无js 带表单 带报告5200字

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 校园篮球网页设计 | 足球体育运动 | 体育游泳运动 | 兵乓球 | 网球 | 等网站的设计与制作HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&…

让你全方位了解Shell终端,轻松学习

关于shell终端&#xff0c;本文将在以下几个方面做以总结和说明&#xff0c;希望对大家有所帮助。 1.什么是shell Shell是用户和Linux操作系统之间的接口。Linux中有多重shell&#xff0c;其中缺省使用的是Bash。如果把Linux内核想象成一个球体的中心&#xff0c;shell就是围绕…

[go学习笔记.第十六章.TCP编程] 3.项目-海量用户即时通讯系统-redis介入,用户登录,注册

1.实现功能-完成用户登录 在redis手动添加测试用户,并画出示意图以及说明注意事项(后续通过程序注册用户) 如:输入用户名和密码,如果在redis中存在并正确,则登录,否则退出系统,并给出相应提示: 提示信息: 1.用户不存在或者密码错误 2.重新注册并登录 redis手动添加测试用户 ser…