xxl-job原理讲解(三):调度中心

xxl-job 原理讲解(一) xxl-job原理讲解(二):主要类 两篇文章中我分析了 xxl-job 的工作原理,本来想一篇文章写完,结果发现内容太多,于是又开一篇 – 这篇文章主要讲 xxl-job 的调度中心的工作原理。

XxlJobScheduler

直接开门见山的说,调度中心的方法入口在 com.xxl.job.admin.core.scheduler.XxlJobScheduler 中:

主要关注 JobRegistryMonitorHelper.getInstance().start(); 和 JobScheduleHelper.getInstance().start(); 两行代码。

不过还是得先从 XxlJobTrigger 说起。

XxlJobTrigger

XxlJobTrigger 中的 trigger 方法:

trigger 就是“触发”的意思,该方法就是触发一次定时任务,入参有 jobId、triggerType、分片策略等参数,最终会调用 processTrigger 方法:

上面已经根据不同的路由策略,得到要执行定时任务的执行器地址,下面的 runExecutor 方法会封装定时任务的各种参数,然后调用 runExecutor 方法通知对应的执行器执行定时任务(注意,是 Http 方式):

可以看到,执行定时任务调用的是 executorBiz.run(…) 方法,此处的 executorBiz 的实现类是 ExecutorBizClient ,已经在这篇文章里讲过:xxl-job原理讲解(二):主要类 – 码先生的博客 (codermr.com)

JobScheduleHelper

上面讲的是触发一次定时任务的逻辑,那么调度中心是怎么按 Cron 表达式中配置的规则对定时任务进行调度的呢?答案就在 JobScheduleHelper 里面,JobScheduleHelper 主要逻辑:

ringData 是一个 Map,key 是从 0 到 59:

下面的线程,就是定时任务”定时触发”的主要逻辑:

“休眠时间小于1s”即 while 循环每 1s 执行一次,获取这 1s 内要执行的定时任务,触发一次执行。

JobRegistryMonitorHelper

在前两篇文章中已经讲过了,执行器会每隔 30s 往调度中心上注册一次(新增或更新 xxl_job_registry 表),而调度中心同样会每隔一段时间检测一下 xxl_job_registry 中哪些执行器还存活着,具体代码在 com.xxl.job.admin.core.thread.JobRegistryMonitorHelper#start 中,逻辑很简单,调度中心会每 30s 查询一次 xxl_job_registry 表看哪些记录的更新时间 90s 都没有变化,这些执行器将被调度中心从 xxl_job_registry 表中删除。

完。

码先生
Author: 码先生

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注