xxl-job 源代码分析
核心概念
执行器
每一个XxlJobExecutor即是一个执行器,执行器包含了:dashbaord的地址信息、appname等关键信息
执行器保存了IJobHandler名称和IJobHandler对象的映射关系
执行器还保存了JobId和JobThread的映射关系,其中JobThread是执行定时任务的核心类,JobThread类又持有了一个IJobHandler对象
执行器还持有一个内置的Http服务器,用于接收dashboard的请求
执行器还持有了一组和dashboard通讯的客户端,用于向dashboard注册通讯等操作
调度器
主要负责定时任务调度,将到时间触发的定时任务交由触发器触发
触发器
定时任务执行的点火器,调用定时任务逻辑
重要的类
com.xxl.job.core.thread.JobThread
该类是Thread的子类,是执行定时任务业务逻辑的核心入口
如前所述,JobThread持有IJobHandler实例,且持有一个任务队列
在核心方法run中可以查看到关于执行IJobHandler的核心逻辑入口
换言之:只要一个时间监控器,当某个任务到达触发时间点,将相关数据添加到JobThread对象的队列中,即可触发定时任务核心逻辑调用
com.xxl.job.admin.core.thread.JobScheduleHelper
dashboard的定时任务调度入口,持有两个Thread实例,用于计算定时任务的触发时间
核心方法:
在该方法中启动了两个线程,其中scheduleThread线程通过查询数据库的定时任务数据,获取将在5秒钟内触发调度的任务信息,计算存入一个以当前秒为key,定时任务id列表为值的map集合中
ringThread将scheduleThread存入的数据取出,添加到触发队列中,完成任务触发
com.xxl.job.admin.core.trigger.XxlJobTrigger:定时任务真正的触发器,通过上面的ringThread传入的定时任务相关参数信息,通过路由器(com.xxl.job.admin.core.route.ExecutorRouter)计算获取最终需要发送http请求的客户端地址,发起调用请求,完成定时任务调度
com.xxl.job.core.biz.ExecutorBiz
客户端和dashboard通讯的接口,具体实现有两个
com.xxl.job.core.biz.client.AdminBizClient
com.xxl.job.core.biz.client.ExecutorBizClient
用于注册、定时调度、调度取消等操作用
核心流程源码分析
客户端
客户端的代码从com.xxl.job.core.executor.XxlJobExecutor#start开始,代码如下所示
xxljobExecutor在执行过程中启动了一个内置的http服务器,(详细逻辑可以查看源码)
同时完成了向dashbaord的注册
详细逻辑可以查看:com.xxl.job.core.thread.ExecutorRegistryThread#start
同时通过向xxlJobExecutor注册处理器IJobHandler,完成绑定关系
至此客户端的主流程已经分析完毕
dashboard端
dashboard在启动的时候初始化类com.xxl.job.admin.core.conf.XxlJobAdminConfig,关于任务调度的入口就是在这个类
最终会调用到com.xxl.job.admin.core.scheduler.XxlJobScheduler#init完成调度资源的初始化
至此和前面(重要的类已经关联上了)。详细的源码请查看具体的代码
遗留的几个问题
在上一章xxl-job-****博客中有提到关于springboot中使用的几点限制
1 方法的返回值必须是ReturnT<String>类型
2 方法的参数类型必须是String类型
在springboot应用中不需要配置XxlJobExecutor,需要配置XxlJobExecutor子类XxlJobSpringExecutor
由类继承图可知,XxlJobSpringExecutor是xxlJobExecutor的子类,且实现了ApplicationContenxtAware、SmartInitializingSingleton接口
主动寻找IJobHandler实例和动态代理的代码示例如下:
详细逻辑参见:com.xxl.job.core.executor.impl.XxlJobSpringExecutor#initJobHandlerMethodRepository
从校验逻辑中可以知道:
以上即是xxl-job的源码分析过程。因为xxl-job的逻辑并不复杂,大家可以按照博文所示自行调试分析
推荐阅读
-
如何在 excel 中自动生成敏感性分析图表
-
C语言的10种基本算法,学习C语言必须要有源代码(珍藏版)
-
Node.js 从基础到高级使用] XXVIII, Node.js 内存管理分析二十八、Node.js 内存管理分析
-
2024 年第一季度电子书在线市场数据分析:高端市场潜力巨大,销售额同比增长超过 170%!
-
NotificationManagerService 的使用细节和原理分析(二)
-
英语动词的属性分析与应用
-
爬行和分析猫眼对电影《流浪地球》的评论
-
谷歌 Chrome 浏览器网络中的停滞分析和优化
-
BGI 引擎分析 (I)、图像资源分析
-
基于 Java 的食品推荐管理系统的设计与实施(源代码 + lw + 部署文档 + 说明等)