XXL-JOB 应用
XXL-JOB 分布式任务调度平台于 2015 年开源,以其轻量级、开箱即用的特性,成为企业级应用中处理定时、批量任务的首选方案
一、核心架构与组件
XXL-JOB 架构简洁而高效,主要由 调度中心(Admin) 和 执行器(Executor) 两部分组成。
-
调度中心(Admin)
- 任务管理(CRUD)
- 调度策略配置
- 执行日志与运行报表
- 统一调度入口
-
执行器(Executor)
- 注册到调度中心
- 接收调度请求
- 执行业务 JobHandler
特性
核心特性:
- 调度高可用(HA):调度中心支持集群部署,基于 DB 锁保证分布式调度一致性
- 执行器高可用:执行器支持集群、故障转移与自动注册发现
- 分片广播与动态扩缩容:适合大数据量、高并发批处理场景
- 丰富触发与路由策略:Cron、固定延迟、API 触发、多种路由算法
- GLUE 在线运维:支持 Shell / Python / NodeJS 等脚本在线编写执行
- 任务依赖与流程编排:支持父子任务、串行流程控制
- 日志与监控体系:实时日志 Rolling 查看、任务执行报表统计
- 跨语言与容器化:RESTful API、Docker 官方镜像支持
二、核心应用场景与实践
1. 分布式高并发数据处理(分片广播)
业务场景
每天凌晨对数百万订单进行结算处理,单机执行效率低、风险高,需要多实例并行处理。
解决方案
使用 XXL-JOB 的 分片广播路由策略,由调度中心广播任务并下发分片参数。
Java JobHandler 示例
@XxlJob("shardingOrderSettleJob")
public ReturnT<String> shardingOrderSettleJob(String param) {
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
XxlJobHelper.log("当前分片:{}/{}", shardIndex, shardTotal);
List<Order> orders =
orderDao.findPendingSettleOrdersBySharding(shardTotal, shardIndex);
for (Order order : orders) {
settleService.processOrder(order);
}
XxlJobHelper.handleSuccess("分片任务完成");
return ReturnT.SUCCESS;
}
2. 跨语言自动化运维(GLUE 模式)
业务场景
定时检查服务器磁盘使用率,超过阈值自动告警,已有 Shell 脚本。
解决方案
使用 XXL-JOB 的 GLUE(Shell) 任务类型,直接在调度中心维护脚本。
GLUE(Shell) 示例
#!/bin/bash
DISK_USAGE=$(df -h | grep '/$' | awk '{print $5}' | sed 's/%//g')
THRESHOLD=90
echo "当前磁盘使用率: $DISK_USAGE%"
if [ $DISK_USAGE -gt $THRESHOLD ]; then
echo "磁盘告警:超过阈值 $THRESHOLD%"
exit 500
else
echo "磁盘状态正常"
exit 0
fi
3. 任务依赖与流程控制
业务场景
财务报表生成流程:
- 数据抽取
- 数据清洗
- 报表生成
要求严格按顺序执行。
解决方案
使用 XXL-JOB 的 父子任务依赖机制。
任务依赖关系
- extractDataJob → cleanDataJob → generateReportJob
JobHandler 示例
@XxlJob("extractDataJob")
public ReturnT<String> extractDataJob(String param) {
// 数据抽取逻辑
return ReturnT.SUCCESS;
}
@XxlJob("cleanDataJob")
public ReturnT<String> cleanDataJob(String param) {
// 数据清洗逻辑
return ReturnT.SUCCESS;
}
效果
- 上游失败,下游自动阻断
- 流程清晰、可追溯
- 适合 ETL / 报表 / 批处理场景