[toc]
## Quartz定时任务触发流程
从数据库的角度看:
![](https://img.kancloud.cn/c5/62/c56297e4ebc7e30cfc33cd420b021f54_1596x2199.png)
从代码角度看:
![](https://img.kancloud.cn/eb/f4/ebf4026f44008a265a38497d619391f7_987x1801.png)
## 核心线程
负责任务调度的几个线程:
1.任务执行线程池:通常使用一个线程池(SimpleThreadPool)维护一组线程, 负责实际每个job的执行。
2. Scheduler调度线程`QuartzSchedulerThread` :轮询存储的所有trigger,如果有需要触发的trigger,即到达了下一次触发的时间,则从任务执行线程池获取一个空闲线程,执行与该trigger关联的任务。
3.处理misfire job的线程MisfireHandler:轮训所有misfire的trigger,原理就是从数据库中查询所有下次触发时间小于当前时间的trigger,按照每个trigger设定的misfire策略处理这些trigger。
### QuartzSchedulerThread源码解读
```
private QuartzScheduler qs;
private QuartzSchedulerResources qsRsrcs; --调度器资源,比如线程池
private final Object sigLock = new Object();
private boolean signaled;
private long signaledNextFireTime;
private boolean paused; --暂停状态
private AtomicBoolean halted; --中止状态
private Random random = new Random(System.currentTimeMillis());
```
QuartzScheduler Thread:用来进行任务调度的线程,在初始化的时候paused=true,halted=false,虽然线程开始运行了,但是paused=true,线程会一直等待, 直到start方法将paused置 为false。
## 参考资料
[quartz定时调度任务触发流程](https://www.processon.com/view/617f66371efad41d03f7e3cf?fromnew=1)
- 写在前面
- 如何阅读源码
- 第一部分 开源框架
- Netty
- 启动过程
- SpringSecurityOauth2
- Quartz
- quartz启动原理
- quartz定时调度任务触发流程
- 第二部分 优质中间件源码分析
- Canal
- Canal是如何伪装为mysql的slave的?
- canal源码调试
- Sentinel
- 核心概念梳理
- 滑动窗口实现原理
- jvm-sandbox
- jvm-sandbox-repeater
- Windows环境安装
- 结果比对
- 第三部分 优质行业项目源码分析
- 第一章 分库分表实践
- sharding-jdbc
- 第二章 DDD领域驱动
- 享同科技DDD开源框架
- J-IM
- 功能测试
- 悟空CRM
- 项目搭建
- 默认密码
- dataX-web
- 项目搭建
- 部署报错
- dolphinscheduler
- awescnb
- geek
- chrome插件-funds
- 优质开源项目备忘