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/jobhandler3. 注册 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-Job | Quartz |
|---|---|---|
| 上手难度 | 简单,有 Web 控制台 | 较复杂 |
| 分布式支持 | 原生支持 | 需额外配置 |
| 动态修改任务 | 支持(无需重启) | 不支持 |
| 执行日志 | 实时查看 | 无 |
| 分片任务 | 原生支持 | 不支持 |
| 监控告警 | 内置 | 无 |