2. xxl-job源码分析-核心XxlJobExecutor

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

上一篇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<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值