上一篇1. xxl-job源码分析-从demo开始 介绍了xxl-job中的xxl-job-executor-sample-springboot,本篇继续深入,介绍其中的重点内容XxlJobExecutor。只要是要集成xxl-job的都需要创建一个XxlJobExecutor,也就是xxl-job的一个执行器。这次让我们一探究竟,看他是如何同中心服务进行连接执行的。
XxlJobExecutor参数
首先看到的是这个类的参数,也就是可以给XxlJobExecutor赋值配置的属性。
// 调度中心配置的地址
private String adminAddresses;
// 访问控制的token
private String accessToken;
// 本地应用的名字
private String appname;
// 本地的地址,也就是注册地址,如果设置了值就忽略ip+端口的地址
private String address;
// 本地的ip
private String ip;
// 本地的端口
private int port;
// 日志路径
private String logPath;
// 保留日志的天数
private int logRetentionDays;
这些属性都是见名知意的,具体的作用会在后续介绍。
在XxlJobExecutor类中,作者很贴心的帮忙把这个重要的类分解成了几个部分,用分割线分割开。下面我们跟着作者的思路,一一进行剖析讲解。
start + stop
// ---------------------- start + stop ----------------------
public void start() throws Exception {
// 初始化日志路径
XxlJobFileAppender.initLogPath(logPath);
// 根据中心调度平台,初始化调用的客户端对象
initAdminBizList(adminAddresses, accessToken);
// 启动日志文件清理线程,用来清理日志文件
JobLogFileCleanThread.getInstance().start(logRetentionDays);
// 启动回调线程
TriggerCallbackThread.getInstance().start();
// 初始化客户端服务
initEmbedServer(address, ip, port, appname, accessToken);
}
public void destroy(){
// 停止客户端服务
stopEmbedServer();
// 销毁处理的线程
if (jobThreadRepository.size() > 0) {
for (Map.Entry<Integer, JobThread> item: jobThreadRepository.entrySet()) {
JobThread oldJobThread = removeJobThread(item.getKey(), "web container destroy and kill the job.");
// wait for job thread push result to callback queue
if (oldJobThread != null) {
try {
oldJobThread.join();
} catch (InterruptedException e) {
logger.error(">>>>>>>>>>> xxl-job, JobThread destroy(join) error, jobId:{}", item.getKey(), e);
}
}
}
jobThreadRepository.clear();
}
jobHandlerRepository.clear();
// 停止日志清理
JobLogFileCleanThread.getInstance().toStop();
// 停止回调线程
TriggerCallbackThread.getInstance().toStop();
}
上面这段代码,描述了客户端在启动和停止的流程。
启动的时候,需要初始化日志路径、初始化调用的客户端对象(类方法,后面会有想想讲解)、启动日志文件清理线程、启动回调线程、初始化客户端服务(类方法,这里采用了Netty进行网络传输,后面会说到)。
停止的时候,就和启动是相反了,启动了什么,就需要关闭什么,包括停止客户端服务、销毁处理的线程、停止日志清理和停止回调线程。
这里面很多具体的实现并没有直接写在启动和停止的内部,而是拆分成了多个小方法。这样让代码看起来更加的精简,也方便我们快速寻找我们所关系的逻辑。
因为初始化日志路径,启动日志文件清理线程,这两个都不是重点。都是见名知意,不是很复杂,大家可以自行查看研究。这里只是介绍一下启动回调线程。这个回调线程是在执行器执行完任务后,回调任务结果时使用的。
启动回调线程
public void start() {
// 校验注册到中心的客户端是否为空
if (XxlJobExecutor.getAdminBizList() == null) {
logger.warn(">>>>>>>>>>> xxl-job, executor callback config fail, adminAddresses is null.");
return;
}
// callback
triggerCallbackThread = new Thread(new Runnable() {
@Override
public void run() {
// normal callback
while(!toStop){
try {
// 线程死循环的获取阻塞队列中的回调到调度中心的参数,获取不到会进行阻塞
HandleCallbackParam callback = getInstance().callBackQueue.take();
if (callback != null) {
// callback list param
List<

本文详细分析了XxlJobExecutor的启动和停止过程,包括初始化日志路径、客户端服务的启动与停止、回调线程的运行逻辑。文章还介绍了XxlJobExecutor如何与调度中心进行连接,如admin-client的创建以及executor-server的角色。同时,提到了jobHandlerRepository和jobThreadRepository在存储和管理任务执行器中的作用。
最低0.47元/天 解锁文章
655

被折叠的 条评论
为什么被折叠?



