xxl-job原理讲解(二):主要类

xxl-job 原理讲解 – 码先生的博客 (codermr.com) 这篇源码分析里内容越写越多,所以还是把 xxl-job 主要的类单独抽取到一篇文章里吧。

AdminBiz 接口

它有两个实现类:

  • com.xxl.job.core.biz.client.AdminBizClient
  • com.xxl.job.admin.service.impl.AdminBizImpl

根据名字就可以知道,AdminBizImpl 是调度中心使用的;AdminBizClient 是执行器使用的,里面有发送 registry、callback 等请求。而 AdminBizImpl 里面也有 registry、callback 等方法,其实 AdminBizClient 中的 registry、callback 请求最终会被 AdminBizImpl 里面的 registry、callback 方法处理。

JobThread 类

看 TriggerParam 这个类中参数的含义:

JobThread 的构造器(JobThread 持有一个 jobId 和 该 jobId 对应的 JobHandler):

JobThread 类里面的属性(已加注释):

JobThread 类里面的方法(已加注释):

添加一个要被执行的定时任务 TriggerParam 到 TriggerQueue 队列中:

主要是 run 方法:

如上,简单总结就是:从 TriggerQueue 中取出一个任务并执行,然后调用调度中心的 callback 接口告诉其执行结果。

思考题:JobThread 是每个定时任务都会 new 一个吗?

Yes.

ExecutorBizImpl

先看 ExecutorBiz 接口:

ExecutorBiz 接口有两个实现类:

xxl-job 中,一个接口有两个实现,一般主动发请求的一方的实现类名中会带有 client 字样,类似的还有 AdminBiz 接口。
  • ExecutorBizClient 是调度中心往执行器发送请求的,最终会被执行器的 ExecutorBizImpl 接受并处理。ExecutorBizClient 中的方法主要有往执行器会发送心跳检测、通知执行器执行任务等操作。
  • ExecutorBizImpl 是在执行器中被使用的,在执行器的 com.xxl.job.core.server.EmbedServer#start 方法中,使用 Netty 和调度中心进行通信,接受到调度中心用 ExecutorBizClient 发送过来的网络请求后,创建了一个 EmbedHttpServerHandler 处理该网络请求,而 EmbedHttpServerHandler 中就是用 ExecutorBizImpl 来处理网络请求的,ExecutorBizImpl 中有心跳回复、执行定时任务等逻辑

再看看 XxlJobExecutor 这个类,它里面有个 jobThreadRepository 属性,如下,key 是 jobId ,value 是上面刚刚讲到的 JobThread:

ExecutorBizImpl 中主要是两个心跳相关的方法、一个 run 方法:

上面的 idleBeat 方法里会从 XxlJobExecutor 中的 jobThreadRepository 中获取 jobId 对应的 JobThread 对象。

com.xxl.job.core.biz.impl.ExecutorBizImpl#run 方法

先从 XxlJobExecutor 中的 jobThreadRepository 中获取 jobId 对应的 JobThread 对象,再从 JobThread 对象中得到 JobHandler 对象 jobHandler;

再从 XxlJobExecutor 中的 jobHandlerRepository 中获取 jobId 对应的 JobHandler 对象,如果和上面的 jobHandler 不一样,则返回错误信息。

然后判断该定时任务的阻塞策略,如果是“覆盖”,则判断如果 JobThread 还正在执行作业或其 triggerQueue 中有排队作业,则 destroy 之前的 JobThread ,并重新创建 JobThread 运行当前作业;如果是“丢弃”,则判断如果 JobThread 还正在执行作业或其 triggerQueue 中有排队作业,则当前作业丢弃。

然后:

往 JobThread 中添加一个要被执行的定时任务。

相关类分析完毕,请继续看 xxl-job 原理讲解 – 码先生的博客

码先生
Author: 码先生

发表回复

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