quartz适合轻量可控场景,xxl-job适合任务多、需可视化运维的团队;二者均解决多实例不重复、重启不丢失、动态管理问题,选择取决于系统阶段和运维能力。

Spring Boot 集成 Quartz 或 XXL-JOB,本质是解决多实例下任务不重复、重启不丢失、可动态管理这三个核心问题。选哪个不取决于“谁更高级”,而要看你的系统阶段和运维能力。
Quartz:嵌入式集群调度,适合中等复杂度、已有数据库、想轻量可控的团队
它不是独立服务,而是作为 Spring Boot 应用的一个组件运行,但通过数据库锁实现多节点协调。
-
关键配置两步走
- 引入依赖(Spring Boot 2.7+):
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-quartz</artifactid></dependency><dependency><groupid>com.h2database</groupid><artifactid>h2</artifactid><scope>runtime</scope></dependency>
- 在
application.yml中启用 JDBC 持久化并开启集群:spring: quartz: job-store-type: jdbc jdbc: initialize-schema: always properties: org.quartz.scheduler.instanceId: AUTO org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.isClustered: true
- 引入依赖(Spring Boot 2.7+):
-
任务必须无状态,靠 JobDataMap 传参
public class DataSyncJob implements Job { @Override public void execute(JobExecutionContext context) { String table = context.getJobDetail().getJobDataMap().getString("table"); syncService.sync(table); // 真实业务逻辑 } }创建时用
JobBuilder+CronTriggerBuilder动态注册,支持运行时增删改查。 注意一个硬约束
所有节点的org.quartz.scheduler.instanceName必须相同,instanceId设为AUTO,且数据库时间必须同步(误差建议
XXL-JOB:中心化调度平台,适合任务多、需可视化、多人协作或已有运维规范的团队
它把“调度”和“执行”彻底分离:调度中心(xxl-job-admin)统一发令,你的 Spring Boot 应用只作为执行器(Executor)响应调用。
-
先部署调度中心(推荐 Docker)
Alibabacloud Sdk Client Initialization For Java下载在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
docker run -d \ -e PARAMS="--spring.datasource.url=jdbc:mysql://192.168.1.100:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8 \ --spring.datasource.username=root \ --spring.datasource.password=123456" \ -p 8080:8080 \ --name xxl-job-admin \ xuxueli/xxl-job-admin:2.3.0启动后访问
http://localhost:8080/xxl-job-admin,默认账号admin/123456,首次登录会自动初始化表结构。 -
在 Spring Boot 项目中接入执行器
加依赖:<dependency><groupid>com.xuxueli</groupid><artifactid>xxl-job-core</artifactid><version>2.3.0</version></dependency>
配置
application.yml:xxl: job: admin: addresses: http://localhost:8080/xxl-job-admin executor: appname: my-springboot-app ip: port: 9999 logpath: ./logs/job logretentiondays: 30再加一个配置类注册执行器 Bean,然后写任务方法:
@XxlJob("orderTimeoutHandler") public void handleOrderTimeout() { orderService.closeExpiredOrders(); }之后在调度中心 Web 界面新建任务,填上
JobHandler名、Cron、路由策略、阻塞处理策略即可。 -
优势直接体现在日常操作里
- 运营要临时把报表任务从每天 2 点改成 3 点?后台点几下就生效,不用发版
- 某个任务失败了?界面直接看到错误堆栈、触发时间、耗时,还能手动“触发一次”
- 服务扩容到 5 台?执行器自动注册,调度中心按策略分发,无需改一行代码
怎么选:看当前痛点在哪
- 如果你只有 2–3 个定时任务,开发运维都是一人,不想多维护一个中间件 → 用 Quartz,够用、干净、不额外占资源
- 如果任务已超 5 个,涉及订单、对账、推送、同步等不同域,经常要调时间、查日志、通知告警 → 直接上 XXL-JOB,省下的排查时间远大于部署成本
- 别纠结“未来会不会升级”,XXL-JOB 的执行器本身非常轻量,后期想切回 Quartz 也不冲突;反之,从 Quartz 自研一套调度后台,投入产出比极低
不复杂,但容易忽略细节。










