当前位置: 首页 > news >正文

Quartz 任务调度框架源码阅读解析

概念: quartz 是一个基于JAVA的定时任务调度框架

案例: 

<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.0</version></dependency>JobDetail job = JobBuilder.newJob(SchedulerTs.class).withIdentity("job1", "group1").usingJobData("name", "zs").build();Date endDate = DateUtils.addMinutes(new Date(), 2);SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger", "triggerGroup").withSchedule(SimpleScheduleBuilder.simpleSchedule()// 任务执行间隔.withIntervalInSeconds(10)// 重复执行次数.withRepeatCount(10)).forJob(job).endAt(endDate).startNow().build();StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();Scheduler scheduler = stdSchedulerFactory.getScheduler();// 配置任务scheduler.scheduleJob(job, trigger);scheduler.start();

使用、上手难度: 简单

效果已经实现了、那么这个是怎么实现的呢、很费解、所以花了一早上时间扒了扒源码、解惑

首先介绍几个关键的类: 


        StdSchedulerFactory 调度工厂、Scheduler 调度工具(类)、QuartzSchedulerThread 任务执行线程、SchedulerRepository 单例的调度仓库 、 JobDetail 任务job封装接口、SimpleTrigger 触发器

        现在看着有点多、记不住. 蓝色部分忽略、他只是建造者模式的应用、封装了 很多属性方法、SchedulerRepository 单例的调度仓库 也可以忽略、他只是一个map 用来存放 调度类的,并且也能够避免相同调度类的重复创建;

        重头戏: 找到切入点 StdSchedulerFactory 调度工厂 是如何获取到 调度类 Scheduler 的,并且 Scheduler.start   scheduleJob 方法做了什么,我认为看懂这两块,基本就算差不多了

        创建 StdSchedulerFactory 对象,只是一个空对象,什么也没有做、关键点在于StdSchedulerFactory 的 getScheduler  方法, 我们先看源码

        到现在比较明了了. 主要工作在 initialize 方法 和 instantiate 方法做的,我们逐个分析
        initialize 源码.只粘贴关键代码. 实际上他也只是做了文件解析、将文件中的配置信息交给Properties,然后将 配置信息交给 工厂类的属性 cfg 对象.这个对象只是在properties 外面封装了一层.本质还是一个properties、配置信息包含一些线程数、执行间隔啥的. 这个就是配置、具体不做讨论

        instantiate 源码、这个方法做的 任务比较多、涉及到 QuartzSchedulerThread 类的创建和启动、调度仓库调度器的插入、前面的配置信息就是在这一步装配到任务上的,废话不多说、直接看源码

        现在又会有一个疑惑、一个线程执行一次就结束了、他怎么做到一直监听到有新任务进来的呢? 关键在于 一个while 循环 和 sigLock 对象的 awaitnotifyAll 操作,下面图放了 这个线程run方法的动作, 到现在已经明确 instantiate 执行完之后线程就是已经启动的了

        现在我们再去看看 StdSchedulerFactory 的 scheduleJob 方法做了啥,将当前任务 保存到了 triggersByKey 和 jobsByKey 中 ,然后 交给了 listener 和 plugs 监听处理

        最后一步、启动 StdSchedulerFactory.start

        通过 sigLocknotifyAll 通知 quartzSchedulerThread 线程继续执行.

        自己实现的任务是在何时被调用的呢? QuartzSchedulerThread::run 来寻找答案

        新建的shell 是一个线程、initialize 关键步骤,newJob

        找到了、反射 实例话 job类、得到了我们写好的对象
        runThread(shell) 执行了 shell 线程,run方法做了什么 我们看下,job.execute 任务被执行了.
完美,我看到的是这样如果有疏漏麻烦评论区指正,感激,结尾附上思维导图、相对来说更加详细

相关文章:

  • 【K8s】初识PV和PVC
  • 【BUG 记录】MyBatis-Plus 处理枚举字段和 JSON 字段
  • 基于YOLOv8深度学习的复杂场景下船舶目标检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测
  • 云端技术驾驭DAY15——ClusterIP服务、Ingress服务、Dashboard插件、k8s角色的认证与授权
  • hive中常见参数优化总结
  • 【LeetCode-简单】27.移除元素 - 数组与双指针法
  • 五种查看Spring容器中bean的方法
  • 面向对象编程入门:掌握C++类的基础(2/3):深入理解C++中的类成员函数
  • 防御保护课程笔记
  • 【小白学机器学习5】偏差bias, 方差,var 误差error, MSE, RMSE,MAE, MAPE, WMAPE
  • 【Python笔记-设计模式】状态模式
  • 在极狐GitLab 配置 SSL/https
  • oracle DG 原理
  • 一张照片一键换脸:无需数据集和训练 | 开源日报 No.186
  • flutter 学习(二)AS创建flutter项目,一直卡在create,特别慢
  • [Vue CLI 3] 配置解析之 css.extract
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • Apache的基本使用
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • gops —— Go 程序诊断分析工具
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • javascript 总结(常用工具类的封装)
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • php中curl和soap方式请求服务超时问题
  • vue-router 实现分析
  • 回顾2016
  • 如何解决微信端直接跳WAP端
  • 深入浏览器事件循环的本质
  • 使用 QuickBI 搭建酷炫可视化分析
  • 使用API自动生成工具优化前端工作流
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #define
  • ( 10 )MySQL中的外键
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (转)nsfocus-绿盟科技笔试题目
  • (转)shell中括号的特殊用法 linux if多条件判断
  • *** 2003
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .naturalWidth 和naturalHeight属性,
  • .net Application的目录
  • .NET Remoting学习笔记(三)信道
  • .net 受管制代码
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET下ASPX编程的几个小问题
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [C#]获取指定文件夹下的所有文件名(递归)
  • [FxCop.设计规则]8. 也许参数类型应该是基类型
  • [hdu 2826] The troubles of lmy [简单计算几何 - 相似]
  • [javaSE] 看知乎学习工厂模式
  • [MySQL]日期和时间函数