xxljob

简介: 本文深入分析XXL-JOB执行源码,涵盖架构设计与核心模块实现。包含带中文注释的源码包及流程图,详解国际化初始化、任务触发线程池(快慢池机制)、注册中心心跳检测、失败重试告警、任务结果丢失处理、日志清理及时间轮调度等核心逻辑,助你全面掌握其原理。

xxljob执行源码分析
已包含中文注释的源码压缩包:
xxl-job-master.zip
(7.8 MB)
分析流程:
xxljob直播.xmind
(493 KB)
image.png

1.架构分析
2.执行源码
核心代码位置如下:
1-initI18n()
初始化国际化资源,对应配置文件:resources:i18n
2-JobTriggerPoolHelper.toStart()
触发器线程池:创建快慢线程池,提升任务执行效率
如果一个任务在1min内超过10次提交,就默认是慢任务,为了防止慢任务影响系统吞吐量,将其放在慢线程池中运行
快线程池定义:最大线程数=200,等待队列=1000
慢线程池定义:最大线程数=100,等待队列=2000
addTrigger方法
默认选择快线程池,如果任务在1min内超过10次提交,就是慢线程池
真正的触发器操作代码
3-JobRegistryHelper.getInstance().start()
任务注册器线程池:将上线机器刷新(最近90s有心跳),将下线机器移除(90s内没心跳),更新执行组
初始化服务上线/下线线程池:将新增的IP添加到组中,将断线的IP及时清理(因为执行器会上下线,xxl-job会保证及时更新当前在线的执行器)
初始化心跳检测的线程池:xxl-job会把心跳信息保存在xxl_job_registry,借助心跳检测机制,保证机器下线能够及时清楚,机器上线及时发现
4-JobFailMonitorHelper.getInstance().start()
重试报警机制:因为任务是异步调用,需要有一个进程持续监听执行结果,主要做的是:读取本地数据,更新数据状态,未达到失败次数就重试,达到失败次数就告警
借助mybatis查询本地数据库执行失败、且告警状态=0[未告警]的数据日志ID,读取表:xxl_job_log
更新告警状态=-1[锁定,避免多线程并发干扰],0-默认、-1=锁定状态、1-无需告警、2-告警成功、3-告警失败
基于日志ID取出完整的日志信息,读取表:xxl_job_log
基于ID获取失败日志对应的任务信息,读取表:xxl_job_info
如果失败任务可充实次数大于0,表示还能重试,就继续重试
如果配置了告警信息,就实现报警
报警后更新本地告警状态,2或3
5-JobCompleteHelper.getInstance().start()
调度系统调度执行器后,执行器突然宕机,调度系统就可以根据这个线程感知任务到底执行成功还是失败
任务结果丢失处理:调度记录停留在 "运行中" 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度主动标记失败;
6-JobLogReportHelper.getInstance().start()
清理过期日志,没什么需要详细讲解的
7-JobScheduleHelper.getInstance().start()
从xxl_job_info表中找出当前时间+5s的所有执行器数据,然后根据其调度时间判断立即调度还是加入时间戳
取出当前时间 + 5s内所有待执行的执行器数据(避免循环本身导致错过执行时间)
建立数据库链接
关闭事务的自动提交
悲观锁,锁定数据
过期处理策略
可能过期的原因:服务重启;调度线程被阻塞,线程被耗尽;上次调度持续阻塞,下次调度被错过
从数据库取出当前时间+5s的所有任务
当前时间:超过调度时间+5s
判断任务执行状态是否是:FIRE_ONCE_NOW,如果是就立马调度一次
刷新调度时间,避免下一次再错过
当前时间:超过调度时间,但还没超过5s
调度一次
更新调度时间,避免下一次再错过
当前时间:没超过调度时间,把调度时间加入到时间轮中
获取调度时间的秒
将调度时间作为key,任务id作为value,放进调度任务时间轮的map中(其执行代码在:238行)
刷新下一次调度时间(这里就不是new Date()了,而是真实的执行时间)
更新每一个任务的最近一次执行时间、下一次执行时间、执行状态
时间轮执行原理
时间轮执行原理:com.xxl.job.admin.core.thread.JobScheduleHelper#ringThread
先延迟0-1秒,以保证加载所有数据
获取当前时间对应的秒数
避免处理耗时太长,跨过刻度,向前校验一个刻度
这里的ringData就是上面场景3中添加进去的数据,当前文件代码:149行
当前秒+1是为了防止时间轮中的任务由于意外没有执行,从而有一个补偿机制
调度任务
清空已处理数据

相关文章
|
3月前
|
Java 数据库连接 调度
xxljob执行源码分析
本文深入解析XXL-JOB源码,涵盖架构设计、核心执行流程与关键线程机制。包括任务调度、快慢线程池分离、注册与心跳检测、失败重试告警、日志清理及时间轮原理,结合图文详解各组件实现逻辑,助你全面掌握分布式任务调度底层机制。
 xxljob执行源码分析
|
存储 Java BI
XXL-JOB定时任务知识点和应用实例
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。该处只是介绍xxl_job的一下基础知识和使用的实例,具体的安装调试请参照对应的最新的官方文档,中文开源地址:https://www.xuxueli.com/xxl-job
4751 0
|
3月前
|
Java 数据库连接 调度
xxljob执行源码分析
本文深入解析XXL-JOB分布式任务调度框架的源码实现,涵盖架构设计、核心执行流程与关键线程机制。内容包括任务触发、快慢线程池分离、注册与心跳检测、失败重试告警、日志清理、时间轮调度等核心模块,结合源码与流程图全面剖析其高性能设计原理。(239字)
xxljob执行源码分析
|
3月前
|
Java 调度 数据库
搭建XXL-JOB
XXL-JOB由调度中心和执行器两部分组成。调度中心负责任务调度与管理,支持动态配置、监控告警;执行器部署在微服务中,接收调度请求并执行任务。通过SpringBoot集成xxl-job-core,配置注册地址后可自动注册到调度中心,实现分布式任务调度。
|
3月前
|
人工智能 NoSQL Java
Spring AI 进阶之路03:集成RAG构建高效知识库
本文介绍如何在Spring Boot中集成RAG(检索增强生成)技术,通过Redis向量数据库为大模型外挂私域知识库。手把手实现文档上传、切分、向量化存储,并构建支持普通对话与知识库问答双模式的智能聊天机器人,解决大模型对私有信息无知的问题,助力打造企业级AI应用。
1169 1
|
11月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,日期时间格式化是前后端交互的常见痛点。本文详细解析了 **@DateTimeFormat** 和 **@JsonFormat** 两个注解的用法,分别用于将前端传入的字符串解析为 Java 时间对象,以及将时间对象序列化为指定格式返回给前端。通过完整示例代码,展示了从数据接收、业务处理到结果返回的全流程,并总结了解决时区问题和全局配置的最佳实践,助你高效处理日期时间需求。
1781 0
|
NoSQL Java API
MongoDB 强制使用索引 hint
MongoDB 强制使用索引 hint
624 3
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
33868 0
|
存储 Java 应用服务中间件
Java规则引擎Drools急速入门
Java规则引擎Drools急速入门
10501 0
Java规则引擎Drools急速入门
ly~
|
消息中间件 存储 数据库连接
RocketMQ 消息的重试机制是怎样的?
RocketMQ的消息重试机制确保消息消费失败时能自动重试,直至成功。默认重试16次,时间间隔逐次翻倍,从10秒至数分钟不等。重试在同组内不同消费者间进行,由异常抛出或特定状态返回触发。支持自定义重试次数与时间间隔,建议合理配置避免无限重试,保障系统稳定性和性能。
ly~
4241 2