《SpringBoot中@Scheduled和Quartz的区别是什么?分布式定时任务框架选型实战》​

《SpringBoot中@Scheduled和Quartz的区别是什么?分布式定时任务框架选型实战》​

🌟 ​大家好,我是摘星!​ 🌟

今天为大家带来的是@Scheduled和Quartz对比分析:

新手常见困惑:
刚学SpringBoot时,我发现用@Scheduled写定时任务特别简单。但当我看到同事在项目里用Quartz时,代码突然变得复杂起来——为什么要用这些复杂的配置?难道注解不香吗?

今天,我们就用最直白的方式,手把手对比这两种方案。

目录

1. 定位与设计目标

1.1. @Scheduled注解

1.2. 定时任务框架(如Quartz、XXL-JOB)

2. 特性对比

3. @Scheduled

3.1. 基础用法

3.2. 致命缺陷

4. Quartz :复杂且强大

5. 本质区别

6. Q&A

6.1. 我该什么时候切换用Quartz?

6.2. Quartz配置好麻烦,有简化方案吗?

6.3. 听说还有XXL-JOB,我需要学吗?

7. 避坑指南:新手常犯的3个错误

7.1. Cron表达式写错格式

7.2. 忘记线程池配置

7.3. 在集群环境混用两种方案

8. 总结


 

1. 定位与设计目标

1.1. @Scheduled注解

  • 轻量级单机调度:Spring框架原生支持的简单定时任务工具,无需引入额外依赖。
  • 场景适用:适用于单应用实例、无需复杂调度逻辑的定时任务(如数据清理、缓存刷新)。
  • 设计核心:基于内存的任务调度,依赖Spring容器生命周期管理。

1.2. 定时任务框架(如Quartz、XXL-JOB)

  • 企业级调度平台:面向分布式、高可用、复杂调度需求的场景(如任务分片、失败重试、依赖管理)。
  • 核心能力:支持任务持久化、集群部署、动态配置、监控报警等生产级功能。
  • 扩展性:提供插件机制、任务管理界面(如XXL-JOB的Admin控制台)。

2. 特性对比

特性

@Scheduled

定时任务框架(以Quartz为例)

任务持久化

❌ 任务信息仅存于内存

✅ 支持数据库持久化,任务可恢复

分布式调度

❌ 单机运行,多实例会重复执行

✅ 集群环境下任务互斥,避免重复执行

动态调整任务

❌ 需重启应用修改配置

✅ 支持运行时动态修改触发规则

失败重试机制

❌ 默认无重试

✅ 支持自定义重试策略和次数

任务分片

❌ 不支持

✅ 支持任务分片执行(如Elastic Job)

任务依赖管理

❌ 不支持

✅ 支持任务链式或DAG依赖调度

监控与管理界面

❌ 无

✅ 提供Web控制台(如XXL-JOB)

Cron表达式灵活性

✅ 支持标准Cron

✅ 支持扩展Cron(如Quartz的秒级精度)

任务执行线程池

✅ 可自定义TaskScheduler

✅ 提供线程池配置和任务队列管理


 

3. @Scheduled

3.1. 基础用法

场景:每天凌晨3点清理临时文件

步骤:

  1. 在SpringBoot启动类加@EnableScheduling
@SpringBootApplication @EnableScheduling // 关键!开启定时任务支持 public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } }
  1. 在Bean中写任务方法
@Component public class CleanTempFileJob { // 最简单的固定间隔执行 @Scheduled(fixedRate = 5000) // 每5秒执行一次 public void cleanCache() { System.out.println("正在清理临时文件..." + new Date()); } // Cron表达式控制复杂时间 @Scheduled(cron = "0 0 3 * * ?") // 每天3点执行 public void dailyClean() { // 业务逻辑... } }

优点
✅ 开发快,5行代码就能跑起来
✅ 无需引入额外依赖
✅ 适合快速验证想法

3.2. 致命缺陷

场景升级
当项目部署到两台服务器时,你突然发现——明明只该执行一次的任务,两个节点同时跑起来了!这就是单机方案的致命缺陷。

问题总结

场景

现象

根本原因

多实例部署

重复执行

无集群协调机制

任务执行时间过长

其他定时任务被延迟

默认单线程执行

服务器重启

未完成的任务不会自动恢复

无持久化机制

举个真实案例:

// 统计每日订单量的任务 @Scheduled(cron = "0 0 1 * * ?") public void countDailyOrders() { // 执行时间长达10分钟 heavyDatabaseOperation(); }

当这个任务运行时,其他所有@Scheduled任务都会被阻塞,直到它完成!

4. Quartz :复杂且强大

解决思路
引入专业框架,实现:

  1. 任务持久化(重启不丢失)
  2. 线程池隔离(任务互不影响)
  3. 集群协调(多节点不重复)

实现步骤

  1. 添加依赖
<!-- pom.xml --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
  1. 配置数据库(这里用H2演示)
# application.properties spring.quartz.job-store-type=jdbc spring.datasource.url=jdbc:h2:mem:testdb spring.quartz.properties.org.quartz.jobStore.isClustered=true
  1. 定义任务逻辑
public class OrderStatJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) { // 从context获取参数 System.out.println("执行订单统计:" + new Date()); } }
  1. 配置触发器
@Configuration public class QuartzConfig { @Bean public JobDetail orderStatJobDetail() { return JobBuilder.newJob(OrderStatJob.class) .withIdentity("orderStatJob") // 任务唯一标识 .storeDurably() .build(); } @Bean public Trigger orderStatTrigger() { return TriggerBuilder.newTrigger() .forJob(orderStatJobDetail()) .withIdentity("orderStatTrigger") .withSchedule(CronScheduleBuilder.cronSchedule("0 0 2 * * ?")) // 每天2点 .build(); } }

关键改进
✅ 任务信息存数据库,重启后自动恢复
✅ 默认线程池大小10,任务并行执行
✅ 集群部署时通过数据库锁避免重复执行


5. 本质区别

对比维度

@Scheduled

Quartz

学习成本

5分钟入门

需要理解Job/Trigger等概念

多节点执行

所有节点同时执行

同一任务集群中只执行一次

任务中断恢复

不支持

支持自动恢复未完成任务

任务执行时间

单线程,长任务会阻塞其他任务

线程池隔离,任务互相独立

动态调整

需重启应用

可通过API动态修改调度策略

适用场景

单机简单任务

分布式环境、需要可靠性的任务

6. Q&A

6.1. 我该什么时候切换用Quartz?

当遇到以下情况时:

  • 需要部署多个服务实例
  • 任务执行超过30秒可能影响其他任务
  • 老板要求不能因为服务器重启丢任务

6.2. Quartz配置好麻烦,有简化方案吗?

试试用@PersistJobDataAfterExecution注解:

@PersistJobDataAfterExecution // 自动持久化任务数据 @DisallowConcurrentExecution // 禁止并发执行 public class SafeJob extends QuartzJobBean { // ... }

6.3. 听说还有XXL-JOB,我需要学吗?

如果你的项目已经分布式部署,且需要:

  • 可视化的任务管理界面
  • 自动分片处理大数据量任务
  • 实时日志查看
    那么XXL-JOB更适合,但学习曲线更高。

7. 避坑指南:新手常犯的3个错误

7.1. Cron表达式写错格式

Spring的@Scheduled和Quartz的Cron略有不同:

    • Spring:秒 分 时 日 月 周几
    • Quartz:支持秒级精度和更多特殊字符

7.2. 忘记线程池配置

在@Scheduled中记得自定义线程池:

@Bean public TaskScheduler taskScheduler() { return new ThreadPoolTaskScheduler(); }

7.3. 在集群环境混用两种方案

千万不要同时用@Scheduled和Quartz做同一个任务!


8. 总结

记住这个选择口诀:

单机简单用注解,
多节点上Quartz。
若是任务要可靠,
持久化配置不能少。

 

Read more

【Git:远程操作和标签管理】从克隆到推送:Git 远程协作与标签管理实战指南

【Git:远程操作和标签管理】从克隆到推送:Git 远程协作与标签管理实战指南

🔥艾莉丝努力练剑:个人主页 ❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶、测试开发要点全知道 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬艾莉丝的简介: 目录 艾莉丝的Gitee地址 1  ~>  远程操作 1.1  理解分布式版本控制系统 1.2  远程仓库 1.3  创建远程仓库 1.4  克隆远程仓库 1.4.1  使用HTTPS方式 1.4.2  使用SSH方式 1.5  向远程仓库推送 1.6

By Ne0inhk

从开源到落地:SimpleBGC 三轴稳像平台全栈技术解析(上)

引言:为什么选择 SimpleBGC? 在无人机航拍、工业检测、机器人视觉等场景中,“稳定” 是核心需求 —— 哪怕设备轻微抖动,也会导致画面模糊、数据偏差。而市面上专业稳像设备(如大疆 Ronin 系列)动辄数千元,且闭源架构无法自定义扩展。 SimpleBGC 的出现打破了这一局面:它以开源架构为核心,硬件设计文件、固件代码完全公开,成本仅为专业设备的 1/5~1/10,同时支持从微型运动相机到工业级负载的全场景适配。无论是电子爱好者 DIY、学生做科创项目,还是中小企业开发定制化设备,SimpleBGC 都是性价比极高的选择。 本文将从 “硬件电路设计→软件代码解析→软件算法分析” 三个维度,带大家彻底搞懂这款开源稳像平台的技术细节,即使是刚接触嵌入式开发的新手,也能跟着步骤理解原理、动手实践。 第一部分:SimpleBGC 硬件电路设计 —— 开源架构下的模块化方案 SimpleBGC 的硬件设计遵循 “模块化、

By Ne0inhk
别在自己造轮子了!推荐一款功能炸裂的开源人工智能解决方案,内置产品级IOC、以图搜图,人像搜索

别在自己造轮子了!推荐一款功能炸裂的开源人工智能解决方案,内置产品级IOC、以图搜图,人像搜索

💂 个人网站:IT知识小屋🤟 版权: 本文由【IT学习日记】原创、在ZEEKLOG首发、需要转载请联系博主💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 文章目录 * 简介 * 开发环境 * 功能模块 * 开源地址&使用手册 * 写在最后 简介 本项目是一款依托于JAVA实现的通用人工智能解决方案,涵盖了模型训练、推理到Web/桌面应用的一整套AI功能。支持产品级OCR文字识别(可自定义模板)、图像搜索、人脸检索、智能抠图、照片上色、图像增强、机器翻译、RAG搜索以及大模型接入等,可开箱即用。 系统采用主流技术栈:SpringBoot + Vue搭建,后端使用SpringBoot提供API服务,前端基于Vue实现可视化管理,支持模块化部署和二次开发。项目代码完全开源,模块之间高度解耦,用户可按需引入,灵活扩展,特别适合需要快速集成 AI 功能的企业与个人开发者。

By Ne0inhk
从安装到代码提交:Git 远程协作中 90% 的问题都能在这里找到答案

从安装到代码提交:Git 远程协作中 90% 的问题都能在这里找到答案

工欲善其事,必先利其器。 目录 * 安装 Git 的步骤: * 本地Git与远程仓库连接及操作全指南 * 一、本地仓库初始化与远程仓库连接 * 1. 初始化本地Git仓库 * 2. 关联远程仓库 * 1. 查看当前分支状态 * 2. 新建本地分支 * 方法1:基于当前分支创建新分支 * 方法2:创建并直接切换到新分支(推荐) * 方法3:基于远程分支创建本地分支 * 3. 切换到已有的本地分支 * 二、分支管理与远程分支同步 * 1. 查看远程分支 * 2. 拉取远程分支到本地 * 三、代码提交与推送到远程仓库 * 1. 常规提交流程 * 2. 简化推送命令 * 四、远程仓库信息查看与更新 * 1. 查看远程仓库详细信息 * 2. 同步远程仓库最新数据 * 五、常见问题解决与优化配置 * 1. 网络与连接问题修复 * 2. 推送大文件或提升传输稳定性

By Ne0inhk