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的.