Java 定时任务四方案:@Scheduled、Quartz、XXL-Job、PowerJob——怎么选
引言
凌晨 3 点被电话叫醒,打开日志发现定时任务又双击了——上次跑的实例还没结束,这次又开始了,两份并行把库存扣了两遍。这不是什么复杂的分布式 bug,就是单机 @Scheduled 在多实例部署下没有做幂等也没有做调度协调,各跑各的。
找运维要个控制台看看任务状态,答:"没有控制台,任务定义在代码里,改 Cron 要重新发版。" 要个失败重试和告警,答:"自己写 log + 钉钉机器人。" 要个任务执行历史,答:"去 ELK 里搜。"
@Scheduled 是个很好的起点,但业务长到"多实例部署 + 任务可视化 + 动态调整 + 失败告警"这四件事里的任何一个,它就不够用了。 团队开始找替代方案:Quartz?XXL-Job?PowerJob?每个方案看起来都能解决一部分问题,但谁也说不清哪个最适合自己。这篇文章把四个方案按"从简单到复杂"排开,逐个拆解能力边界,最后给一张决策树——照着选就行。
一、四个方案速览
1.1 一句话定位
| 方案 | 一句话定位 | 调度 vs 执行 |
|---|---|---|
| @Scheduled | Spring 原生注解,单机定时器 | 应用内线程池 |
| Quartz | Java 生态老牌调度框架,支持 Cron + 集群 | 应用内或独立 |
| XXL-Job | 分布式任务调度平台,可视化控制台 | 调度中心 + 执行器分离 |
| PowerJob | 新一代分布式调度与计算框架,支持 MapReduce | 调度服务器 + Worker |
1.2 演进路线
@Scheduled → Quartz → XXL-Job → PowerJob
单机定时 集群协调 分布式调度 分布式计算
↓ ↓ ↓ ↓
能跑就行 多实例不重复 控制台可视 大数据分片处理
每一步演进解决的是前一个方案的核心瓶颈:@Scheduled 的瓶颈是多实例重复执行 → Quartz 用数据库锁协调 → XXL-Job 把调度和执行分离拿到控制台 → PowerJob 把"任务"升级成"计算作业"支持 MapReduce。
二、方案一:@Scheduled——最简单的起点
2.1 基本用法
@Component
@Slf4j
public class SimpleScheduler {
@Scheduled(fixedRate = 5000) // 每 5 秒(上次开始后计时)
public void syncStock() {
log.info("[SyncStock] 开始同步库存");
stockService.syncFromUpstream();
}
@Scheduled(cron = "0 0 2 * * ?") // 每天凌晨 2 点
public void dailyReport() {
reportService.generateDaily();
}
@Scheduled(fixedDelay = 10000, initialDelay = 30000) // 启动 30s 后开始,每 10s 一次
public void healthCheck() {
healthService.checkAll();
}
}
@SpringBootApplication
@EnableScheduling // 开启定时任务支持
public class App { }
2.2 三种触发模式
| 模式 | 语义 | 适用 |
|---|---|---|
fixedRate | 上次开始后间隔 N ms | 固定频率(不等任务完成) |
fixedDelay | 上次完成后间隔 N ms | 固定间隔(等任务做完再计时) |
cron | Cron 表达式 | 复杂时间规则(每天 2 点、每月 1 号等) |
fixedRate 的陷阱:如果任务执行时间 > fixedRate,Spring 不会并发执行(默认单线程),会等前一次完成才启动下一次——fixedRate 在任务耗时超过间隔时退化为 fixedDelay。要真正并发执行需要配 @Async 或自定义线程池。
2.3 配置线程池(默认单线程是最大瓶颈)
spring:
task:
scheduling:
pool:
size: 5 # 调度线程池大小(默认 1!)
thread-name-prefix: sched-
默认单线程意味着:一个任务卡住,所有其他 @Scheduled 任务全部排队等待——月结对账任务卡了 30 分钟,凌晨 2 点的健康检查就拖到 2:30 才执行。上线前必改 pool.size。
2.4 @Scheduled 的五个能力缺口
| 缺口 | 说明 | 影响 |
|---|---|---|
| 多实例重复执行 | 没有调度协调,3 个实例各跑一遍 | 幂等设计兜底,否则数据翻倍 |
| 无动态修改 | Cron 写在注解里,改要重新发版 | 运维灵活性差 |
| 无可视化 | 没有控制台看执行状态、历史 | 排障靠日志 |
| 无失败重试 | 抛异常就结束,不会自动重试 | 需要手写 try-catch + 重试 |
| 无告警 | 任务失败了无人知晓 | 需要自己接告警 |
2.5 适用场景
单机 / 任务少 / Cron 固定 / 容忍失败重试手写。项目早期、内部小工具、PoC 验证——@Scheduled 完全够用。触发迁移的信号:部署实例 >1 个且任务不能重复执行、需要动态改 Cron、需要执行历史和告警——满足任一条该升级了。
三、方案二:Quartz——集群协调的老牌选手
3.1 核心能力:数据库锁实现集群调度
Quartz 的集群模式靠数据库行锁实现"只有一个节点执行任务":
3 个实例共享同一张 QRTZ_LOCKS 表
→ 触发时刻到 → 各实例争抢 TRIGGER_ACCESS 行锁
→ 只有 1 个拿到锁的实例执行任务
→ 释放锁后其他实例才能获取下一个触发器
3.2 Spring Boot 集成
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
public class OrderReportJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) {
// 任务逻辑
reportService.generateDaily();
}
}
@Configuration
public class QuartzConfig {
@Bean
public JobDetail orderReportJobDetail() {
return JobBuilder.newJob(OrderReportJob.class)
.withIdentity("orderReportJob")
.storeDurably()
.build();
}
@Bean
public Trigger orderReportTrigger() {
return TriggerBuilder.newTrigger()
.forJob(orderReportJobDetail())
.withIdentity("orderReportTrigger")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 2 * * ?"))
.build();
}
}
spring:
quartz:
job-store-type: jdbc # 集群模式用数据库存储
jdbc:
initialize-schema: embedded # 自动建表(生产用 never,手动执行 SQL)
properties:
org.quartz.scheduler.instanceId: AUTO # 集群实例 ID 自动生成
org.quartz.jobStore.isClustered: true # 开启集群模式
org.quartz.jobStore.clusterCheckinInterval: 20000
3.3 Quartz 的优劣
| 维度 | 评价 |
|---|---|
| ✅ 集群协调 | 多实例不重复执行(DB 行锁保证) |
| ✅ Cron 灵活 | 比 @Scheduled 的 cron 多了年字段,支持更复杂规则 |
| ✅ 持久化 | 任务定义和执行历史存 DB,重启不丢 |
| ❌ 无控制台 | 没有可视化管理界面(社区有 quartz-dashboard 但不成熟) |
| ❌ API 重 | Job/Trigger/JobDetail/Scheduler 四件套,开发体验差 |
| ❌ 集群依赖 DB | DB 是单点瓶颈,QRTZ_LOCKS 行锁在高频任务下竞争激烈 |
| ❌ 无分片 | 集群模式是"选一个执行",不是"分片并行" |
3.4 适用场景
Java 单语言 + 多实例需要协调 + Cron 规则复杂 + 接受无控制台。从 @Scheduled 升级到 Quartz 解决了多实例重复执行,但没有解决可视化和动态修改——这俩痛点催生了 XXL-Job。
四、方案三:XXL-Job——分布式调度的标配
4.1 架构:调度中心 + 执行器分离
┌──────────────────┐ ┌──────────────────┐
│ 调度中心 │ HTTP │ 执行器(业务服务) │
│ (xxl-job-admin) │ ◀──────▶ │ @XxlJob 注解任务 │
│ - 任务管理 │ 心跳注册 │ - 接收调度执行 │
│ - Cron 配置 │ │ - 结果回调上报 │
│ - 调度日志 │ │ - 失败重试 │
│ - 路由策略 │ └──────────────────┘
│ - 告警通知 │
└──────────────────┘
调度和执行分离是 XXL-Job 的核心设计:调度中心只管"什么时候调谁",不执行任何业务逻辑;执行器只管"接到调度后执行任务"。这个分离让调度中心可以做高可用集群、执行器可以随业务服务弹性扩缩容——调度中心不感知执行器有多少个。
4.2 Spring Boot 集成
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.1</version>
</dependency>
xxl:
job:
admin:
addresses: http://xxl-admin-vip:8080/xxl-job-admin # 调度中心地址
accessToken: ${XXL_TOKEN} # 认证 Token
executor:
appname: order-service # 执行器名称
port: 9999 # 执行器端口
logpath: /data/xxl-job/logs # 日志路径
@Component
@Slf4j
public class OrderXxlJobs {
@XxlJob("dailyReportHandler") // 与控制台配置的 JobHandler 名称一致
public void dailyReport() {
String param = XxlJobHelper.getJobParam(); // 从控制台传参
log.info("[DailyReport] param={}", param);
reportService.generateDaily(param);
XxlJobHelper.handleSuccess("done"); // 上报成功
}
/** 分片任务:3 个执行器各处理 1/3 的数据 */
@XxlJob("shardingDataSyncHandler")
public void shardingSync() {
int shard = XxlJobHelper.getShardIndex(); // 当前分片号:0/1/2
int total = XxlJobHelper.getShardTotal(); // 总分片数:3
List<Long> ids = dataService.getAllIds();
List<Long> mine = ids.stream()
.filter(id -> id % total == shard) // 按 ID 取模分片
.toList();
mine.forEach(id -> dataService.syncData(id));
XxlJobHelper.handleSuccess("shard=" + shard + ", count=" + mine.size());
}
}
4.3 八种路由策略
| 策略 | 说明 | 适用 |
|---|---|---|
| FIRST | 选第一个执行器 | 固定实例执行 |
| LAST | 选最后一个 | — |
| ROUND | 轮询 | 负载均衡 |
| RANDOM | 随机 | 负载均衡 |
| CONSISTENT_HASH | 一致性哈希 | 同任务固定到同一实例 |
| LEAST_FREQUENTLY_USED | 最不经常使用 | 选最闲的 |
| SHARDING_BROADCAST | 分片广播 | 所有实例都执行 + 各自分片——MapReduce 的简化版 |
| FAILOVER | 故障转移 | 自动跳过宕掉的执行器 |
SHARDING_BROADCAST 是 XXL-Job 的分片方案:调度中心向所有执行器广播同一任务,每个执行器通过 getShardIndex()/getShardTotal() 知道自己处理哪一份——比"选一个执行"多了一层并行能力。但它只是数据分片,没有失败重试分片的自动补偿能力。
4.4 XXL-Job 的优劣
| 维度 | 评价 |
|---|---|
| ✅ 可视化控制台 | 任务管理、Cron 动态修改、执行历史、日志查看 |
| ✅ 分布式调度 | 调度中心集群高可用 + 执行器自动注册 |
| ✅ 失败重试 | 调度中心自动重试(可配次数和间隔) |
| ✅ 告警 | 内置邮件告警,可扩展钉钉/企微 |
| ✅ 分片 | SHARDING_BROADCAST 基本分片能力 |
| ✅ 动态参数 | 控制台传参,不用改代码 |
| ❌ 调度中心依赖 | 调度中心挂了所有任务停摆(需集群高可用) |
| ❌ 无 MapReduce | 分片是"数据切分"不是"计算框架",无 reduce 阶段 |
| ❌ 无工作流 | 任务之间不能编排依赖(DAG) |
4.5 适用场景
Java 团队 + 多实例 + 需要可视化 + 需要动态修改 + 任务量大但不需要复杂计算。XXL-Job 是 90% 互联网公司的标准选择——从 @Scheduled 或 Quartz 升级过来时,控制台和分片能力是最大体验提升。
五、方案四:PowerJob——分布式计算的新选手
5.1 定位:不只是调度,还是计算框架
PowerJob 在 XXL-Job 的能力基础上,多了三个杀手锏:MapReduce 计算模型、工作流 DAG 编排、容器级任务。它解决的是 XXL-Job 解决不了的"大数据量任务的分布式计算"场景。
5.2 核心能力
/** MapReduce 模式:Map 阶段切分 → 各 Worker 处理 → Reduce 阶段汇总 */
@Component
public class DailySettlementJob {
// Map 阶段:把所有订单按时间分片
public ProcessResult map(TaskSliceContext context) {
LocalDate date = LocalDate.parse(context.getJobParams());
int shard = context.getCurrentIndex(); // 当前分片号
int total = context.getMaxParallel(); // 总分片数
List<Order> orders = orderService.queryByDate(date, shard, total);
long amount = orders.stream().mapToLong(Order::getAmount).sum();
return new ProcessResult(true, new SettlementResult(date, orders.size(), amount));
}
// Reduce 阶段:汇总各 Map 的结果
public ProcessResult reduce(TaskReduceContext context) {
List<SettlementResult> results = context.forEachResult();
long totalAmount = results.stream().mapToLong(SettlementResult::getAmount).sum();
int totalOrders = results.stream().mapToInt(SettlementResult::getCount).sum();
return new ProcessResult(true, new FinalSettlement(totalOrders, totalAmount));
}
}
5.3 工作流 DAG:任务编排
任务 A(拉数据)→ 任务 B(清洗)→ 任务 C(汇总报表)
↘ 任务 D(推送通知)
在控制台上拖拽节点 + 连线,配置依赖关系
- 上游失败时下游自动跳过
- 支持条件分支(IF/ELSE)
- 支持循环和嵌套
5.4 四种任务模式
| 模式 | 说明 | 类比 |
|---|---|---|
| 单机 | 选一个 Worker 执行 | XXL-Job 的 FIRST |
| 广播 | 所有 Worker 都执行 | XXL-Job 的 SHARDING_BROADCAST |
| MapReduce | Map 切分 → Reduce 汇总 | Hadoop MapReduce |
| 工作流 | DAG 编排多任务依赖 | Airflow / DolphinScheduler |
5.5 PowerJob 的优劣
| 维度 | 评价 |
|---|---|
| ✅ MapReduce | 真正的分布式计算框架,不只是数据分片 |
| ✅ 工作流 | DAG 编排,任务依赖可视化 |
| ✅ 控制台 | 可视化管理 + 动态修改 + 执行历史 |
| ✅ 多语言 | 支持 Java/Python/Shell(容器化执行) |
| ✅ 高可用 | 调度服务器集群 + MongoDB/MySQL 持久化 |
| ❌ 社区较新 | 生态成熟度不及 XXL-Job |
| ❌ 架构复杂 | Worker + Server + 持久化层,运维成本高 |
| ❌ 学习曲线 | MapReduce + DAG 概念需要团队消化 |
5.6 适用场景
大数据量批处理 + 任务间有依赖关系 + 需要分布式计算。月结报表、全量数据清洗、日志批处理这类"百万级数据处理 + 多步流程编排"的场景,PowerJob 的 MapReduce 和 DAG 是 XXL-Job 给不了的。
六、四方案对比与选型决策树
6.1 九维对比总表
| 维度 | @Scheduled | Quartz | XXL-Job | PowerJob |
|---|---|---|---|---|
| 单机 | ✅ | ✅ | ✅ | ✅ |
| 集群协调 | ❌ | ✅ DB 行锁 | ✅ 调度中心 | ✅ 调度服务器 |
| 可视化控制台 | ❌ | ❌ | ✅ | ✅ |
| 动态修改 Cron | ❌ | 部分 | ✅ | ✅ |
| 失败重试 | ❌ | ❌ | ✅ | ✅ |
| 告警 | ❌ | ❌ | ✅ 邮件 | ✅ 多渠道 |
| 分片 | ❌ | ❌ | ✅ 广播分片 | ✅ MapReduce |
| 工作流 DAG | ❌ | ❌ | ❌ | ✅ |
| 多语言 | ❌ | Java | Java | Java/Python/Shell |
| 运维成本 | 最低 | 中 | 中 | 高 |
| 社区成熟度 | Spring 原生 | 高(老牌) | 高 | 中(新) |
6.2 选型决策树
你的定时任务场景是什么?
│
├─ 单实例 + 任务少 + Cron 固定 + 容忍手写重试
│ └─ ✅ @Scheduled(够用就好,别过度设计)
│
├─ 多实例 + 不能重复执行 + 但不需要控制台
│ └─ ✅ Quartz(集群 DB 行锁协调)
│
├─ 多实例 + 需要控制台 + 需要动态修改 + 需要失败重试
│ └─ 你的任务有大数据量分片计算需求吗?
│ ├─ 否 → ✅ XXL-Job(90% 团队的默认答案)
│ └─ 是 → ✅ PowerJob(MapReduce + DAG)
│
├─ 任务之间有依赖关系(A 完成后执行 B)
│ └─ ✅ PowerJob(DAG 工作流是唯一原生支持)
│
└─ 多语言(Go/Python 也要被调度)
└─ ✅ PowerJob(容器化执行支持多语言)
或考虑 Airflow / DolphinScheduler(调度引擎而非 Java 框架)
6.3 一个选型忠告
90% 的团队选 XXL-Job 是对的,但 90% 的团队也不需要 MapReduce。
XXL-Job 的控制台 + 分片 + 失败重试 + 告警,覆盖了绝大多数业务定时任务的需求。PowerJob 的 MapReduce 和 DAG 是真正的"分布式计算"能力——如果你的任务只是"每天凌晨跑一个报表",用 PowerJob 等于用 Hadoop 做定时器。选型原则:先用最简单的能覆盖需求的方案,需求超出能力边界再升级。
七、常见问题
7.1 @Scheduled 多实例怎么防重复执行?
三种方案:① 分布式锁(Redis SETNX 在任务执行前获取锁,拿到才执行,最轻量);② 数据库唯一索引(任务执行记录表 + 唯一约束,插重复了说明已执行过);③ 升级到 Quartz/XXL-Job(框架层解决,根治)。过渡期用方案 ① 的 Redis 锁,长期迁移到 XXL-Job 是正道——自己写锁的运维成本不比引入框架低。
7.2 XXL-Job 的调度中心挂了怎么办?
调度中心是单点——挂了所有任务停摆。生产部署必须做调度中心集群(3 节点 + Nginx/SLB 负载均衡 + MySQL 持久化),XXL-Job 原生支持集群模式(基于数据库锁保证只有一个调度节点触发)。调度中心集群本身也有心跳监控,XXL-Job 提供了 DeadMansSwitch 机制(一个心跳任务持续运行,停了就告警)监控调度中心自身健康。
7.3 Quartz 和 XXL-Job 的集群模式有什么本质区别?
Quartz 是"共享 DB 行锁"模式——所有实例争抢同一张表的行锁,拿到锁的执行。DB 是瓶颈,高频任务下行锁竞争激烈。XXL-Job 是"调度中心调度"模式——调度中心决定哪个执行器跑,执行器只是被动接收,无锁竞争。XXL-Job 的架构更适合大规模分布式场景(执行器数量不受 DB 锁限制),Quartz 更适合小规模 Java 团队(不想引入额外调度中心组件)。
7.4 @Scheduled 和 XXL-Job 能共存吗?
能,但要明确分工:@Scheduled 管应用内部的基础任务(健康检查、缓存预热、本地日志清理),XXL-Job 管业务级调度任务(报表、对账、同步)。共存原则:一个任务只在一边定义,不要两边都配同一个任务导致重复执行。
7.5 PowerJob 的 MapReduce 和 Hadoop MapReduce 有什么区别?
PowerJob 的 MapReduce 是任务级别的——把一个任务的数据分成 N 片并行处理,在同一个应用进程组内完成,不需要 HDFS 和 YARN。适合"百万级数据的并行处理"。Hadoop MapReduce 是数据平台级的——需要 HDFS 存储 + YARN 调度 + Mapper/Reducer 完整生态,适合 TB 级大数据计算。PowerJob 是给应用开发者用的轻量 MapReduce,Hadoop 是给数据团队用的重型计算平台——量级不同,不要混淆。
7.6 从 @Scheduled 迁移到 XXL-Job 的迁移节奏?
三步走:① 先给 @Scheduled 任务加分布式锁(防多实例重复,止血阶段);② 选 1~2 个关键任务迁移到 XXL-Job(验证调度中心 + 执行器链路通);③ 存量任务分批迁移(按调用频次从低到高,低频任务先迁验证,高频任务最后迁)。迁移期间不共存同一任务——迁移一个删一个 @Scheduled 注解,避免双触发。
八、总结
四方案速查卡
┌──────────────┬──────────┬──────────┬──────────┬──────────┐
│ 维度 │@Scheduled │ Quartz │ XXL-Job │ PowerJob │
├──────────────┼──────────┼──────────┼──────────┼──────────┤
│ 单机 │ ✅ │ ✅ │ ✅ │ ✅ │
│ 集群协调 │ ❌ │ ✅ DB锁 │ ✅ 调度中心│ ✅ 服务器 │
│ 控制台 │ ❌ │ ❌ │ ✅ │ ✅ │
│ 动态修改 │ ❌ │ 部分 │ ✅ │ ✅ │
│ 失败重试 │ ❌ │ ❌ │ ✅ │ ✅ │
│ 分片 │ ❌ │ ❌ │ 广播分片 │ MapReduce │
│ 工作流DAG │ ❌ │ ❌ │ ❌ │ ✅ │
│ 运维成本 │ 最低 │ 中 │ 中 │ 高 │
│ 社区成熟度 │ Spring │ 高 │ 高 │ 中 │
│ 最佳场景 │ 单机起步 │ 小集群 │ 默认选择 │ 大数据计算│
└──────────────┴──────────┴──────────┴──────────┴──────────┘
决策树:单机→@Scheduled;小集群→Quartz;
标准业务→XXL-Job;分布式计算→PowerJob
一句话
定时任务选型的本质是回答"你的任务有多复杂":单机能跑用 @Scheduled(别过度设计),多实例要协调用 Quartz(DB 行锁够用),需要控制台和动态管理用 XXL-Job(90% 团队的默认答案),需要 MapReduce 和工作流编排用 PowerJob(真正的分布式计算框架)。90% 的团队选 XXL-Job 是对的——但 90% 的团队也不需要 MapReduce,用 PowerJob 做定时器等于用 Hadoop 跑 cron。选型从最简单的开始,能力边界到了再升级,别用大炮打蚊子也别用弹弓打飞机。
给团队的建议
| 项 | 建议 |
|---|---|
| 起步 | 项目初期 @Scheduled + 分布式锁,快速验证业务逻辑 |
| 成长 | 多实例 + 需要管理时迁移 XXL-Job,控制台 + 告警 + 重试一次性补齐 |
| 进阶 | 大数据量批处理才上 PowerJob(MapReduce + DAG) |
| 规范 | 任务幂等是底线(不管哪个框架,重复执行不能出问题) |
| 监控 | 所有定时任务接告警(任务失败 + 执行超时双告警) |
| 迁移 | 一个任务一个任务迁,不共存同一任务,从低频到高频分批 |
互动话题:你们用的哪个定时任务方案?从 @Scheduled 迁到 XXL-Job 踩过什么坑?评论区聊聊。
参考资料
- Spring 官方文档:@Scheduled 与 Task Scheduling
- Quartz 官方文档(集群模式)
- XXL-Job 官方文档
- PowerJob 官方文档
- Spring Boot Quartz 集成指南
- Cron 表达式详解(CronMaker)
标题:Java 定时任务四方案:@Scheduled、Quartz、XXL-Job、PowerJob——怎么选
作者:jiangyi
地址:http://www.jiangyi.space/articles/2026/09/14/1789199689109.html
公众号:服务端技术精选
- 引言
- 一、四个方案速览
- 1.1 一句话定位
- 1.2 演进路线
- 二、方案一:@Scheduled——最简单的起点
- 2.1 基本用法
- 2.2 三种触发模式
- 2.3 配置线程池(默认单线程是最大瓶颈)
- 2.4 @Scheduled 的五个能力缺口
- 2.5 适用场景
- 三、方案二:Quartz——集群协调的老牌选手
- 3.1 核心能力:数据库锁实现集群调度
- 3.2 Spring Boot 集成
- 3.3 Quartz 的优劣
- 3.4 适用场景
- 四、方案三:XXL-Job——分布式调度的标配
- 4.1 架构:调度中心 + 执行器分离
- 4.2 Spring Boot 集成
- 4.3 八种路由策略
- 4.4 XXL-Job 的优劣
- 4.5 适用场景
- 五、方案四:PowerJob——分布式计算的新选手
- 5.1 定位:不只是调度,还是计算框架
- 5.2 核心能力
- 5.3 工作流 DAG:任务编排
- 5.4 四种任务模式
- 5.5 PowerJob 的优劣
- 5.6 适用场景
- 六、四方案对比与选型决策树
- 6.1 九维对比总表
- 6.2 选型决策树
- 6.3 一个选型忠告
- 七、常见问题
- 7.1 @Scheduled 多实例怎么防重复执行?
- 7.2 XXL-Job 的调度中心挂了怎么办?
- 7.3 Quartz 和 XXL-Job 的集群模式有什么本质区别?
- 7.4 @Scheduled 和 XXL-Job 能共存吗?
- 7.5 PowerJob 的 MapReduce 和 Hadoop MapReduce 有什么区别?
- 7.6 从 @Scheduled 迁移到 XXL-Job 的迁移节奏?
- 八、总结
- 四方案速查卡
- 一句话
- 给团队的建议
- 参考资料
评论