Quartz源码分析

下面仅是一些部分上的整理,整体的整理,现在还没有那么多的时间,后续有时间的话,再更新。

Job应用场景

在这里插入图片描述

Job框架有哪些?

在这里插入图片描述

集群调度

在这里插入图片描述
》》》job、trigger(1:N)

》》》Scheduler 看哪个trigger 到了,然后找到相关job,包装成一个任务,线程池去执行。

》》》Scheduler(单例)
多个指挥官,会乱套,你也让我做,他也让我做。

》》》任务运行多少次,等等记录信息,默认在内存。
RAM内存(默认);JDBC持久化(需要配置)

默认配置

在这里插入图片描述

持久化 SQL

在这里插入图片描述

自定义前端控制

在这里插入图片描述
在这里插入图片描述

删除Job(待测试)

在这里插入图片描述

手动启动 Scheduler

在这里插入图片描述

》》》任务不重跑
只有一个节点跑这个任务

》》》任务不漏洞
你想执行,我想执行,最终大家都没执行。

》》》通信、共享、协调
多对多、redis、zk、数据库

集群配置

在这里插入图片描述

任务不重跑

哪个节点抢到任务,就哪个节点跑(随机)。
在这里插入图片描述

任务不漏跑

一个节点挂掉之后,集群管理者会检查到鸡掰了。然后把挂掉的那个节点的任务搞过来,自己跑。
在这里插入图片描述

失火问题

在这里插入图片描述
这里是节点1挂掉后,短暂的一段时间内,任务没有跑。
节点2接管的时候,默认是立即执行一次(默认把全部漏跑的全部跑一次)。

Misfire 失火问题:不同的 Trigger 有不同的失火策略,上面已经说了,默认是立即执行一次(立即把漏掉的全部补上)。

还有其他失火策略。

  • 忽略:错过了就错过了,我从当前来开始执行 job,到了下次触发的时候再触发。
  • 还有一种:到了下次触发的时候,再一起触发。

等等。。。

竞争问题

多个节点,谁能拿到下一个将要触发的 Trigger 呢。
竞争的解决方案就是行级别的锁。

流程图分析

在这里插入图片描述

在这里插入图片描述

*源码分析

1
2
3
4
5
画这张图花了好久,至今 Cron 怎么触发的还不知道。
搞懂了 newJob,new JobExecutionContextImpl、JobRunShell。

还有一点:线程池有可用线程,才会NextTrigger 并执行 JobRunShell,否则会进行下一轮 while 循环。
(所以,当你线程池无线程可用的时候,可能 NextTrigger 已经被别人节点获取并触发了。)
1
2
3
4
5
2022-06-12 17:24:38 又补充了剩余的部分,其实还有很多内容需要补充的。
比如集群的检查啊。

2022-06-12 18:39:31
我又补充了集群的健康检查,和 Misfire 失火问题,但是关于失火的策略,我暂时没有整理,这一块还是未知。

在这里插入图片描述

*Quartz 总结图

在这里插入图片描述