分布式任务调度平台XXL-JOB--源码解析五:executor执行器源码解析之初始化工作

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiongxianze/article/details/84313532

executor执行器初始化工作

1.1 初始化工作

这里我们使用xxl-job自带的xxl-job-executor-sample-spring作为本次源码解析的executor执行器端, 则executor执行器启动时, Spring容器会初始化XxlJobExecutor, 并调用init-method = start()方法.

1.2 XxlJobExecutor类的start()方法分析

该方法内, 主要做了四件事:

初始化admin调度中心代理类.

initAdminBizList(adminAddresses, accessToken);

根据executor执行器xxl-job-executor.properties配置文件中的xxl.job.admin.addresses=http://192.168.136.7:8080/xxl-job-admin配置内容解析多个admin调度中心, 多个调度中心的话, 使用","逗号分割.

将生成的每个admin调度中心代理类, 放入adminBizList数组, 以供以后调用.

从Spring容器中获取所有使用@JobHandler注解标记的实例类, 并将该jobHandler放入本地缓存jobHandlerRepository, 以jobHandler注解的value作为key存入map缓存

initJobHandlerRepository(applicationContext);

③  根据xxl-job-executor.properties配置文件中的xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/配置的log日志地址设置保存的log日志地址.

这里的logPath就是xxl-job-executor.properties配置文件中的xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/配置项内容.

XxlJobFileAppender.logPath = logPath;

初始化ExecutorBizImpl对象, 用于执行admin调度中心发送过来的执行请求, 并将该对象放入本地缓存.分析

initExecutorServer(port, ip, appName, accessToken);

功能一:启动jetty server服务, 暴露xxl-job-executor.properties配置文件中配置的xxl.job.executor.port=9999端口, 对admin调度中心提供服务.

功能二: executor执行器向admin调度中注册的心跳线程registryThread:

该线程有两个作用, 一是, 作为executor执行器和admin调度中心的心跳, 二是, 作为executor执行器向admin调度中心的注册ip+port的线程.

功能三:启动一个executor执行器端执行结果的日志回传admin调度中心的线程triggerCallbackThread, 告诉admin调度中心本次调度job的结果.

doCallBack()方法, 即是进行了一次http网络请求, 调用admin调度中心的callback回传接口, 回传executor执行器执行本次调度的结果给admin调度中心.

那么, job的执行日志是什么时候放入队列的呢?

当executor执行器执行完成调度任务时, 就将本次调度的执行结果和logId封装成HandlerCallbackParam参数, 再入队列.执行调度任务是在JobThread线程完成的, 下一篇将着重分析jobThread是如何执行本次任务的.

附上代码:

 public void start() throws Exception {
        // init admin-client
        // 初始化每一个admin, 并生成代理, 保存到list
        initAdminBizList(adminAddresses, accessToken);

        // init executor-jobHandlerRepository
        if (applicationContext != null) {
            // 将@JobHander(value = "demoJobHandler")注解标记的jobHander放入map内存
            initJobHandlerRepository(applicationContext);
        }

        // init logpath
        if (logPath != null && logPath.trim().length() > 0) {
            XxlJobFileAppender.logPath = logPath;
        }

        // init executor-server
        initExecutorServer(port, ip, appName, accessToken);
    }

总结,

executor执行器的初始化工作做了什么事:

1 executor执行器, 按照配置文件配置的admin调度中心的地址, 生成adminBiz动态代理类, 通过该类使用http接口, 调用admin调度中心的方法, 完成executor执行器的registry服务注册与暴露, executor执行器执行调度的结果callback回传给admin调度中心.

2 从Spring容器中取出使用@JobHandler注解标记的job任务处理类, 并放入本地缓存.

3 配置executor执行器控制台日志打印地址.

4 ①初始化ExecutorBizImpl实例, 用于执行具体的run()方法

   ②并启动jetty server 服务, 用户监听从admin调度中心发送过来的http请求, 执行任务.

   ③开启两个线程:向admin调度中心注册自己暴露服务的线程和回传任务执行结果的线程.

下一篇将解析, 当admin调度中心触发一次调度, executor执行器的jetty server服务是如何接受服务并且执行job的.

  

展开阅读全文

没有更多推荐了,返回首页