xxl-job源码分析

本文详细解析了XXL-JOB框架中的执行器、调度器、触发器等关键组件的工作原理,以及它们在定时任务执行过程中的作用。特别关注了SpringBoot集成时的一些限制。
摘要由CSDN通过智能技术生成

核心概念

执行器

每一个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-CSDN博客中有提到关于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的逻辑并不复杂,大家可以按照博文所示自行调试分析

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值