术语对照
| 术语 | 含义 | 数量 |
|---|---|---|
| 调度中心 | XXL-Job Admin 服务,负责任务配置、触发调度、监控管理 | 1 个 |
| 执行器 | 你的 SpringBoot 应用,集成 xxl-job-core 客户端 |
1 个应用 |
| 实例 | 执行器的具体进程,一个 JVM 进程 | N 个 |
| 分片 | 任务拆分的数据切片,每个实例处理一份 | = 实例数 |
核心关系
调度中心 (1 个)
│
└── 管理执行器应用 (按 appname 识别)
│
└── 包含 N 个实例 (按执行器地址区分)
│
└── N = 分片数
架构图
┌─────────────────────────────────────────────────────────────────────────┐
│ 【主】调度中心 (xxl-job-admin) │
│ 职责: 配置任务 → 触发调度 → 查询在线实例数 N → 广播任务给 N 个实例 │
│ 地址: http://localhost:7070/xxl-job-admin │
└─────────────────────────────────────────────────────────────────────────┘
│
│ 1. 心跳注册 (每 30 秒)
│ 2. 任务调度 (按 Cron 触发)
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 【次】执行器集群 (你的 SpringBoot 应用) │
│ │
│ 应用名: `repayment-executor` ← 所有实例相同,用于分组识别 │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 【实例-1】 │ │ 【实例-2】 │ │ 【实例-N】 │ │
│ │ │ │ │ │ │ │
│ │ 地址: 127.0.0.1:9999 │ 地址: 127.0.0.1:9998 │ 地址: 127.0.0.1:9997 │ │
│ │ JVM 进程-1 │ │ JVM 进程-2 │ │ JVM 进程-N │ │
│ │ │ │ │ │ │ │
│ │ 注册后获得: │ │ 注册后获得: │ │ 注册后获得: │ │
│ │ total = N │ │ total = N │ │ total = N │ │
│ │ index = 0 │ │ index = 1 │ │ index = N-1 │ │
│ │ │ │ │ │ │ │
│ │ 执行 SQL: │ │ 执行 SQL: │ │ 执行 SQL: │ │
│ │ MOD(uid,N)=0│ │ MOD(uid,N)=1│ │ MOD(uid,N)=N-1│ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ └──────────────────┼──────────────────┘ │
│ │ │
│ ▼ 并行处理 │
│ ┌─────────────────┐ │
│ │ 数据库表数据 │ │
│ │ 被切成 N 份并行处理 │ │
│ └─────────────────┘ │
│ │
│ 【关键】启动几个 SpringBoot 实例 = 分几片 = 并行度 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
配置速查
调度中心配置
| 配置项 | 值 | 说明 |
|---|---|---|
| 执行器管理 | repayment-executor |
自动注册,等待实例上报 |
| 任务管理 → 路由策略 | 分片广播 | 关键!触发分片机制 |
| 任务管理 → JobHandler | repaymentShardingHandler |
与 @XxlJob 对应 |
| 任务管理 → Cron | 0 0 2 * * ? |
每天凌晨 2 点执行 |
执行器配置 (application.properties)
# 所有实例相同
xxl.job.appname=repayment-executor
xxl.job.admin.addresses=http://localhost:7070/xxl-job-admin
# 每个实例不同 (9999, 9998, 9997...)
xxl.job.executor.port=9999
启动多个实例
# 实例 1
java -jar app.jar --xxl.job.executor.port=9999
# 实例 2
java -jar app.jar --xxl.job.executor.port=9998
# 实例 3
java -jar app.jar --xxl.job.executor.port=9997
代码中获取分片参数
@XxlJob("repaymentShardingHandler")
public ReturnT<String> execute() {
int total = XxlJobHelper.getShardTotal(); // N (总实例数)
int index = XxlJobHelper.getShardIndex(); // 0 ~ N-1 (当前实例序号)
// 业务处理...
return ReturnT.SUCCESS;
}
SQL 分片过滤
SELECT * FROM repayment_plan
WHERE repayment_date = #{date}
AND MOD(user_id, #{total}) = #{index}
核心结论
分片数 = 在线执行器实例数 = 你启动的 SpringBoot 进程数
| 操作 | 结果 |
|---|---|
| 启动 2 个 SpringBoot | 分片数 = 2 |
| 启动 3 个 SpringBoot | 分片数 = 3 |
| 运行中动态加 1 个 | 下次调度自动识别为 N+1 |
| 运行中挂掉 1 个 | 下次调度自动识别为 N-1 |