返回首页

XXL-JOB 应用

2025年12月16日·Java
XXL-JOB 分布式任务调度平台于 2015 年开源,以其轻量级、开箱即用的特性,成为企业级应用中处理定时、批量任务的首选方案

一、核心架构与组件

XXL-JOB 架构简洁而高效,主要由 调度中心(Admin)执行器(Executor) 两部分组成。

  • 调度中心(Admin)

    • 任务管理(CRUD)
    • 调度策略配置
    • 执行日志与运行报表
    • 统一调度入口
  • 执行器(Executor)

    • 注册到调度中心
    • 接收调度请求
    • 执行业务 JobHandler

特性

核心特性:

  1. 调度高可用(HA):调度中心支持集群部署,基于 DB 锁保证分布式调度一致性
  2. 执行器高可用:执行器支持集群、故障转移与自动注册发现
  3. 分片广播与动态扩缩容:适合大数据量、高并发批处理场景
  4. 丰富触发与路由策略:Cron、固定延迟、API 触发、多种路由算法
  5. GLUE 在线运维:支持 Shell / Python / NodeJS 等脚本在线编写执行
  6. 任务依赖与流程编排:支持父子任务、串行流程控制
  7. 日志与监控体系:实时日志 Rolling 查看、任务执行报表统计
  8. 跨语言与容器化: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. 任务依赖与流程控制

业务场景
财务报表生成流程:

  1. 数据抽取
  2. 数据清洗
  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 / 报表 / 批处理场景
#Java# 定时任务