XXL-JOB 详解 速览
一、核心概念与架构设计
XXL-JOB 是一个轻量级分布式任务调度平台,采用 中心化调度(Admin) + 去中心化执行(Executor) 的 C/S 架构。其核心设计目标是 开发迅速、学习简单、轻量级、易扩展,通过调度中心与执行器分离的模式,实现任务调度与业务逻辑解耦,提升系统稳定性和可维护性。
1. 核心组件
- 调度中心(Admin):
- 负责任务管理(增删改查)、调度触发、监控日志、执行器管理等。
- 提供可视化 Web 界面,支持动态修改任务参数(如 CRON 表达式)并实时生效。
- 执行器(Executor):
- 接收调度中心的请求,执行具体任务逻辑。
- 支持集成到现有业务系统或独立部署,通过线程池管理任务执行。
2. 通信机制
- 底层协议:基于 Netty HTTP 通信,支持异步非阻塞调用。
- 接口设计:
ExecutorBiz
:封装执行器操作(如触发任务、心跳检测)。AdminBiz
:封装调度中心操作(如回调通知、注册取消)。
- 异步处理:执行器接收任务后存入阻塞队列,由独立线程异步执行,减少网络延迟对吞吐量的影响。
3. 数据库设计
- 关键表包括:
xxl_job_info
:存储任务配置(如 CRON 表达式、执行器、路由策略)。xxl_job_log
:记录任务执行日志(结果、耗时、异常信息)。xxl_job_registry
:维护执行器注册信息(IP、端口、心跳时间)。
二、集成步骤(以 Spring Boot 为例)
1. 部署调度中心
- 下载源码:
git clone https://github.com/xuxueli/xxl-job.git
- 初始化数据库:
- 执行
doc/db/tables_xxl_job.sql
,生成 8 张核心表。
- 执行
- 修改配置:
# application.properties 示例 spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8 spring.datasource.username=root spring.datasource.password=123456 server.port=8080
- 启动项目:
java -jar xxl-job-admin.jar
2. 集成执行器
- 添加依赖:
<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.4.0</version> </dependency>
- 配置参数:
# application.yml 示例 xxl: job: admin: addresses: http://localhost:8080/xxl-job-admin executor: appname: my-executor port: 9999 logpath: /data/applogs/xxl-job logretentiondays: 30
- 初始化执行器 Bean:
@Configuration public class XxlJobConfig { @Value("${xxl.job.admin.addresses}") private String adminAddresses; @Bean public XxlJobSpringExecutor xxlJobExecutor() { XxlJobSpringExecutor executor = new XxlJobSpringExecutor(); executor.setAdminAddresses(adminAddresses); executor.setAppname("my-executor"); executor.setPort(9999); return executor; } }
3. 开发任务
- Bean 模式(推荐):
@Component public class SampleJob { @XxlJob("demoJobHandler") public void execute() throws Exception { XxlJobHelper.log("任务执行中..."); // 业务逻辑 } }
- GLUE 模式:在调度中心控制台直接编写 Java/Shell/Python 代码,适合快速迭代。
三、操作指南
1. 创建执行器
- 登录调度中心(默认账号
admin/123456
)。 - 进入 执行器管理 > 新增执行器,填写
AppName
(需与代码配置一致)。
2. 创建调度任务
- 进入 任务管理 > 新增任务,配置关键参数:
- 执行器:选择已注册的执行器。
- 路由策略:如
FIRST
(第一个执行器)、ROUND
(轮询)。 - Cron 表达式:如
0 0 0 * * ?
(每天 0 点执行)。 - 任务参数:通过
XxlJobHelper.getJobParam()
获取。
- 保存并启动任务。
3. 监控与日志
- 任务日志:查看每次任务的执行结果、耗时、异常信息。
- 执行日志:定位到具体执行器日志文件(路径配置在
xxl.job.executor.logpath
)。
四、高级功能
1. 分布式锁
- 通过
xxl_job_lock
表实现任务互斥,避免重复执行。 - 适用场景:如订单超时关闭、库存同步等需要保证唯一性的任务。
2. 失败重试
- 在任务配置中设置 失败重试次数,支持手动触发重试。
- 适用场景:如消息队列消费失败后的补偿机制。
3. API 触发
- 通过 HTTP 接口触发任务:
curl http://调度中心地址/xxl-job-admin/api/trigger?jobId=1&executorParam=test
- 适用场景:如业务代码中根据条件动态触发任务。
4. 任务依赖
- 配置 子任务 ID,实现任务间的依赖调度。
- 适用场景:如 A 任务完成后自动触发 B 任务(如数据清洗 → 报表生成)。
5. 分片广播
- 集群部署时,通过路由策略(如轮询、随机)分配任务到不同执行器。
- 适用场景:如批量用户画像分析、日志清理等并行任务。
五、实际应用案例
1. 优惠券定时发放
- 问题:集群环境下避免重复发放。
- 解决方案:
- 使用 XXL-JOB 分布式锁。
- 配置 Cron 表达式
0 0 10 * * ?
(每天 10 点执行)。
2. 数据备份与清理
- 需求:每周全量备份,每小时清理临时文件。
- 实现:
- 创建两个任务,分别配置不同的 Cron 表达式。
- 备份任务使用
ROUND
路由策略,清理任务使用FIRST
策略。
3. MQ 消息补偿
- 场景:消息消费失败后重试。
- 实现:
- 监控消息表,对失败消息记录任务 ID。
- 通过 API 触发补偿任务,重新消费消息。
六、注意事项
- 执行器端口冲突:单机部署多个执行器时,需配置不同端口。
- 时区问题:确保调度中心与执行器时区一致(推荐使用
Asia/Shanghai
)。 - 日志权限:确保执行器日志目录有读写权限。
- 安全性:配置访问权限和登录认证,防止未授权访问。
- 资源占用:合理分配任务资源,避免影响其他服务。
- 版本更新:定期检查并升级 XXL-JOB 版本,获取最新功能和安全修复。
通过以上详解,您已掌握 XXL-JOB 的核心架构、集成步骤、操作细节及高级功能,可结合实际业务场景灵活应用。如需进一步优化,可参考官方文档或社区案例。