XXL-Job

XXL-Job 是一个轻量级分布式任务调度平台,核心设计目标是开发迅速、学习简单、轻量级、易扩展。

架构组成

XXL-Job 由两个核心部分组成:

  • 调度中心(Admin):负责任务的管理、调度触发、执行日志、报警通知,是一个独立的 Spring Boot 应用,提供 Web 控制台。
  • 执行器(Executor):嵌入业务应用中,负责接收调度中心的调度请求并执行对应的任务逻辑。
调度中心 (Admin)
    │  HTTP 调度触发
    ▼
执行器 (Executor) ──── 业务 JobHandler

核心概念

概念说明
调度中心统一管理任务调度,触发执行器
执行器注册到调度中心,执行具体 Job
JobHandler具体任务逻辑,用 @XxlJob 注解标注
GLUE在线编辑并动态发布任务代码,无需重启
分片广播一次调度中所有执行器并行执行,适合大数据量分片处理

快速接入

1. 引入依赖

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.4.1</version>
</dependency>

2. 配置执行器

xxl:
  job:
    admin:
      addresses: http://127.0.0.1:8080/xxl-job-admin
    executor:
      appname: my-executor
      port: 9999
      logpath: /data/applogs/xxl-job/jobhandler

3. 注册 JobHandler

@Component
public class MyJobHandler {
 
    @XxlJob("myJob")
    public void execute() throws Exception {
        XxlJobHelper.log("任务开始执行");
        // 业务逻辑
        XxlJobHelper.handleSuccess();
    }
}

路由策略

策略说明
FIRST固定选择第一个执行器
LAST固定选择最后一个执行器
ROUND依次轮询所有执行器
RANDOM随机选择一个执行器
CONSISTENT_HASH一致性哈希,同参数路由到同一执行器
FAILOVER心跳检测,选第一个正常的执行器
BUSYOVER选第一个不忙碌的执行器
SHARDING_BROADCAST广播所有执行器,并传递分片参数

分片广播

适用于大批量数据的并行处理:

@XxlJob("shardingJob")
public void shardingJob() {
    int shardIndex = XxlJobHelper.getShardIndex(); // 当前分片序号
    int shardTotal = XxlJobHelper.getShardTotal(); // 总分片数
 
    // 按分片查询:id % shardTotal == shardIndex
    List<Order> orders = orderMapper.selectBySharding(shardIndex, shardTotal);
    orders.forEach(this::processOrder);
}

任务阻塞处理策略

策略说明
单机串行(默认)新调度进入队列,串行执行
丢弃后续调度执行器忙碌时丢弃本次调度
覆盖之前调度执行器忙碌时中断之前任务,执行新调度

高可用部署

调度中心支持集群部署,通过数据库分布式锁保证同一任务同一时刻只由一个节点触发:

调度中心节点1 ──┐
调度中心节点2 ──┤── 共享 MySQL(乐观锁竞争)──► 执行器集群
调度中心节点3 ──┘

与 Quartz 对比

特性XXL-JobQuartz
上手难度简单,有 Web 控制台较复杂
分布式支持原生支持需额外配置
动态修改任务支持(无需重启)不支持
执行日志实时查看
分片任务原生支持不支持
监控告警内置

相关链接