当前位置: 首页 > article >正文

《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 {@Overrideprotected void executeInternal(JobExecutionContext context) {// 从context获取参数System.out.println("执行订单统计:" + new Date());}
}
  1. 配置触发器
@Configuration
public class QuartzConfig {@Beanpublic JobDetail orderStatJobDetail() {return JobBuilder.newJob(OrderStatJob.class).withIdentity("orderStatJob") // 任务唯一标识.storeDurably().build();}@Beanpublic 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。
若是任务要可靠,
持久化配置不能少。

相关文章:

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

&#x1f31f; ​大家好&#xff0c;我是摘星&#xff01;​ &#x1f31f; 今天为大家带来的是Scheduled和Quartz对比分析&#xff1a; 新手常见困惑&#xff1a; 刚学SpringBoot时&#xff0c;我发现用Scheduled写定时任务特别简单。但当我看到同事在项目里用Quartz时&…...

安装fvm可以让电脑同时管理多个版本的flutter、flutter常用命令、vscode连接模拟器

打开 PowerShellfvm安装 dart pub global activate fvm安装完成后&#xff0c;如果显示FVM无法识别&#xff0c;那么需要去添加环境变量path添加这个&#xff1a;C:\Users\Administrator\AppData\Local\Pub\Cache\bin 常用命令 fvm releases 查看用户可以装的flutter版本fvm l…...

UNION和UNION ALL的主要区别

UNION和UNION ALL的主要区别在于处理重复数据和排序的方式。 UNION和UNION ALL都是SQL语言中用于合并两个或多个SELECT语句结果集的关键字。它们的主要区别如下&#xff1a; 1、对重复结果的处理&#xff1a;UNION在进行表链接后会筛选掉重复的记录&#xff0c;而UNION ALL不会…...

Kafka系列之:计算kafka集群topic占的存储大小

Kafka系列之:计算kafka集群topic占的存储大小 topic存储数据格式统计topic存储大小定时统计topic存储大小topic存储数据格式 单位是字节大小 size_bytes{directory="/data/datum/kafka/optics-all" } 782336计算topic存储大小脚本逻辑是: 计算指定目录或文件的大小…...

[密码学实战]Java使用Bouncy Castle实现Base64编码解码:完整指南

Java使用Bouncy Castle实现Base64编码解码:完整指南 摘要 本文将深入讲解如何通过Bouncy Castle(BC)加密库实现Base64编码解码,包含核心API使用、流式处理、与加密算法集成三大实战场景,提供5种代码实现方案和3种性能优化技巧。 一、Base64基础原理 1.1 编码机制 Bas…...

智谱AI大模型免费开放:开启AI创作新时代

文章摘要&#xff1a;近日&#xff0c;国内领先的人工智能公司智谱AI宣布旗下多款大模型服务免费开放&#xff0c;这一举措标志着大模型技术正式迈入普惠阶段。本文将详细介绍智谱AI此次开放的GLM-4 等大模型&#xff0c;涵盖其主要功能、技术特点、使用步骤以及应用场景&#…...

为什么要给单片机植入操作系统

给单片机植入操作系统&#xff08;通常是实时操作系统&#xff0c;RTOS&#xff09;主要是为了在资源有限的环境中实现更高效、更可靠的多任务管理和系统调度。以下是主要原因和优势&#xff1a; 1. 多任务并行处理 背景&#xff1a;单片机通常需要同时处理多个任务&#xff0…...

T1结构像+RS-fMRI影像处理过程记录(数据下载+Matlab工具箱+数据处理)

最近需要仿真研究T1结构像RS-fMRI影像融合处理输出目标坐标的路线可行性。就此机会记录下来。 为了完成验证目标处理&#xff0c;首先需要有数据&#xff0c;然后需要准备对应的处理平台和工具箱&#xff0c;进行一系列。那么开始记录~ 前言&#xff1a; 为了基于种子点的功能连…...

【前端基础】--- HTML

个人主页  :  9ilk    专栏  :  前端基础 文章目录 &#x1f3e0; 初识HTML&#x1f3e0; HTML结构认识HTML标签HTML文件基本结构标签层次结构快速生成代码框架 &#x1f3e0; HTML常见标签注释标签标题标签 h1-h6段落标签 p换行标签 br格式化标签图片标签 img超链接标签…...

黑马V11版 最新Java高级软件工程师课程-JavaEE精英进阶课

课程大小&#xff1a;60.2G 课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/90615581 更多资源下载&#xff1a;关注我 阶段一 中台战略与组件化开发专题课程 阶段二 【物流行业】品达物流TMS 阶段三 智牛股 阶段四 千亿级电商秒杀解决方案专题 …...

C#插件与可扩展性

外接程序为主机应用程序提供了扩展功能或服务。.net framework提供了一个编程模型,开发人员可以使用该模型来开发加载项并在其主机应用程序中激活它们。该模型通过在主机和外接程序之间构建通信管道来实现此目的。该模型是使用: System.AddIn, System.AddIn.Hosting, System.…...

CVPR‘25 | 高文字渲染精度的商品图文海报生成

本文分享阿里妈妈智能创作与AI应用团队在图文广告创意方向上提出的商品图文海报生成模型&#xff0c;通过构建字符级视觉表征作为控制信号&#xff0c;可以实现精准的图上中文逐像素生成。基于该项工作总结的论文已被 CVPR 2025录用&#xff0c;并在阿里妈妈业务场景落地&#…...

Golang|抽奖相关

文章目录 抽奖核心算法生成抽奖大转盘抽奖接口实现 抽奖核心算法 我们可以根据 单商品库存量/总商品库存量 得到每个商品被抽中的概率&#xff0c;可以想象这样一条 0-1 的数轴&#xff0c;数轴上的每一段相当于一种商品&#xff0c;概率之和为1。 抽奖时&#xff0c;我们会生…...

RT-Thread开发文档合集

瑞萨VisionBoard开发实践指南 RT-Thread 文档中心 RT-Thread-【RA8D1-Vision Board】 RA8D1 Vision Board上的USB实践RT-Thread问答社区 - RT-Thread 【开发板】环境篇&#xff1a;05烧录工具介绍_哔哩哔哩_bilibili 【RA8D1-Vision Board】基于OpenMV 实现图像分类_哔哩哔哩_…...

rulego-server是一个开源程序,是一个轻量级、无依赖性的工作流自动化平台。支持 iPaaS、流式计算和 AI 能力。

一、软件介绍 文末提供程序和源码下载学习 RuleGo-Server 是一个基于 RuleGo 构建的轻量级、高性能、模块化和集成友好的自动化工作流程平台。可用于自动化编排、iPaaS&#xff08;集成平台即服务&#xff09;、API 编排、应用编排、AI 编排、数据处理、IoT 规则引擎、AI 助手…...

鸿蒙系统开发状态更新字段区别对比

在鸿蒙系统开发中&#xff0c;状态管理是构建响应式UI的核心机制&#xff0c;主要通过装饰器&#xff08;Decorators&#xff09;实现字段的状态观测与更新。根据鸿蒙的版本&#xff08;V1稳定版和V2试用版&#xff09;&#xff0c;支持的装饰器及其特性有所不同。以下是主要状…...

抽象的https原理简介

前言 小明和小美是一对好朋友&#xff0c;他们分隔两地&#xff0c;平时经常写信沟通&#xff0c;但是偶然被小明发现他回给小美的信好像被人拆开看过&#xff0c;甚至偷偷被篡改过。 对称加密算法 开头的通信过程比较像HTTP服务器与客户端的通信过程&#xff0c;全明文传输…...

HTML理论题

1.什么是HTML? 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。 2.DOCTYPE 的作用是什么?标准与兼容模式(混杂模式)各有什么区别? DOCTYPE 的作用是告知浏览器的解析器用什么文档标准解析这个文档。 标准模式:用于…...

nginx-基础知识(二)

目录 虚拟主机 虚拟主机的功能 虚拟主机的划分方式 基于IP地址进行划分 基于域名进行划分 正向/反向代理 正向代理 反向代理 正向代理和反向代理的区别 负载均衡 负载均衡的类型 负载均衡的作用 nginx并发量比较高的原因 负载均衡的算法 会话保持 虚拟主机 虚拟…...

Ubuntu上安装Mysql

步骤 1&#xff1a;安装 MySQL Server sudo apt update sudo apt install mysql-server -y这将安装最新版本的 MySQL 8.0 以及所有依赖组件。 步骤 2&#xff1a;检查安装是否成功 mysql --version sudo systemctl status mysql如果状态是 active (running)&#xff0c;说明成…...

idea maven 命令后控制台乱码

首先在idea中查看maven的编码方式 执行mvn -v命令 查看编码语言是GBK C:\Users\13488>mvn -v Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: D:\maven\apache-maven-3.6.3\bin\.. Java version: 1.8.0_202, vendor: Oracle Corporation, runt…...

C# dll 打包进exe

Framework4.x推荐使用 Costura.Fody 1. 安装 NuGet 包 Install-Package Costura.Fody工程自动生成packages文件夹&#xff0c;300M左右。生成FodyWeavers.xml、FodyWeavers.xsd文件。 2. 自动嵌入 编译后&#xff0c;所有依赖的 DLL 会被自动嵌入到 EXE 中。 运行时自动解压…...

【数据融合实战手册·实战篇】二维赋能三维的5种高阶玩法:手把手教你用Mapmost打造智慧城市标杆案例

在当今数字化时代&#xff0c;二三维数据融合技术的重要性不言而喻。二三维数据融合通过整合二维数据的结构化优势与三维数据的直观性&#xff0c;打破了传统数据在表达和分析上的局限&#xff0c;为各行业提供了更全面、精准的数据分析手段。从智慧城市建设到工业智能制造&…...

ValueError: model.embed_tokens.weight doesn‘t have any device set

ValueError: model.embed_tokens.weight doesn’t have any device set model.embed_tokens.weight 通常在深度学习框架(如 PyTorch)中使用,一般是在处理自然语言处理(NLP)任务时,用于指代模型中词嵌入层(Embedding layer)的权重参数。下面详细解释: 词嵌入层的作用 …...

解决:QTcpSocket: No such file or directory

项目场景&#xff1a; 使用QTcpSocket进行网络编程&#xff1a; 调用connectToHost连接服务器&#xff0c;调用waitForConnected判断是否连接成功&#xff0c;连接信号readyRead槽函数&#xff0c;异步读取数据&#xff0c;调用waitForReadyRead,阻塞读取数据。 问题描述 找不…...

六、LangChain Agent 最佳实践

1. 架构设计与组件选择 (1) 核心组件分层设计 Model(LLM驱动层) 生产环境推荐:使用 gpt-4-1106-preview 或 Anthropic Claude 3 等高性能模型,结合 model.with_fallbacks() 实现故障转移(如备用模型或本地模型)。本地部署:选择 Llama3-70B 等开源模型,搭配 Docker 或 …...

uni-app 安卓10以上上传原图解决方案

在Android 10及以上版本中&#xff0c;由于系统对文件访问的限制&#xff0c;使用chooseImage并勾选原图上传后&#xff0c;返回的是图片的外部存储路径&#xff0c;如&#xff1a;file:///storage/emulated/0/DCIM/Camera/。这种外部存储路径&#xff0c;无法直接转换成所需要…...

Python爬虫实战: 有道翻译

一、引言 在全球化进程不断加速的当下,语言交流的需求日益增长,翻译服务的重要性愈发凸显。有道翻译作为一款备受欢迎的在线翻译工具,其蕴含的数据具有极高的价值,可广泛应用于自然语言处理研究、翻译教学以及语言学习软件的开发等领域。 然而,为保护自身数据资源和网络安…...

CSS 文件格式

A QFrame#andrFrm[status"android_en"] A&#xff1a;表示父类或顶层窗口的类型。如果 A 是一个自定义的类名&#xff0c;确保该类已经正确注册到 Qt 系统中。QFrame&#xff1a;表示具体的控件类型。#andrFrm&#xff1a;表示控件的对象名称&#xff08;通过 setOb…...

支付宝商家转账到账户余额,支持多商户管理

大家好&#xff0c;我是小悟 转账到支付宝账户是一种通过 API 完成单笔转账的功能&#xff0c;支付宝商家可以向其他支付宝账户进行单笔转账。 商家只需输入另一个正确的支付宝账号&#xff0c;即可将资金从本企业支付宝账户转账至另一个支付宝账户。 该产品适用行业较广&am…...