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

Quartz定时任务持久化(服务重启后自动恢复)

Quartz 定时任务持久化(重启后自动恢复)

声明: 本文内容由 ChatGPT 协助生成,仅作为个人学习与记录之用。

Quartz 默认使用 RAMJobStore(内存存储),服务重启后任务会丢失。
要让定时任务在重启后仍然有效,必须启用:JDBCJobStore(数据库持久化)

本文说明如何在 Spring Boot 项目中配置 Quartz 持久化,使任务存入数据库并在重启后自动恢复。

1. 启用 Quartz 持久化(application.yml)

示例配置:

spring:quartz:job-store-type: jdbc   # 启用数据库持久化jdbc:initialize-schema: always   # 第一次启动自动建表,之后改为 neverproperties:org.quartz.scheduler.instanceName: QuartzSchedulerorg.quartz.scheduler.instanceId: AUTOorg.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegateorg.quartz.jobStore.useProperties: falseorg.quartz.jobStore.tablePrefix: QRTZ_org.quartz.threadPool.threadCount: 10

注意:

  • initialize-schema: always 只在第一次启动时用

第二次以后必须改为 never,避免自动重建表导致任务丢失。

  • 数据库需先创建好,Quartz 会自动建表(第一次)。

2. 初始化数据库(Quartz 表结构)

Quartz 内置表结构 SQL,可在 quartz-x.x.jar 中找到:

路径:

org/quartz/impl/jdbcjobstore/

根据数据库选择:

数据库 SQL 文件
MySQL tables_mysql_innodb.sql
PostgreSQL tables_postgres.sql
Oracle tables_oracle.sql

执行后会生成 11 张表,例如:

  • QRTZ_JOB_DETAILS

  • QRTZ_TRIGGERS

  • QRTZ_CRON_TRIGGERS

  • QRTZ_SIMPLE_TRIGGERS

  • QRTZ_FIRED_TRIGGERS

  • QRTZ_SCHEDULER_STATE

  • QRTZ_LOCKS

...

这些表记录 Job/Trigger,实现持久化。

3. 可选:为 Job 启用持久化注解(存储 JobDataMap)

如果你的 Job 需要持久化任务状态,添加:

@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class MyJob implements Job {...
}

功能说明:

注解 作用
@PersistJobDataAfterExecution 执行后的JobDataMap数据状态写回数据库
@DisallowConcurrentExecution 任务串行执行,避免读写冲突

@DisallowConcurrentExecution 的作用

防止同一个 Job 的多个实例并发执行。

也就是说:

Quartz 会等待当前 Job 执行完,才会执行下一次触发。

为什么需要这个注解?

Quartz 默认行为是:

  • 假设你的 Job 计划每 5 秒 执行一次

  • 但你的任务实际执行时间是 10 秒

那么:

  • Quartz 会在第 5 秒再并发启动一个 Job 实例

  • 第 10 秒再启动一个

  • 这样会导致同一个 Job 多实例并发执行

这在很多业务场景是危险的:

  • 写数据库时造成脏数据

  • 写文件导致冲突

  • 调接口重复提交

  • 修改共享变量时出并发问题

加上 @DisallowConcurrentExecution 后

Quartz 保证:

✔ 第一个任务没执行完
✔ Quartz 不会再启动第二个
✔ 任务之间严格串行执行
✔ 安全性强

@PersistJobDataAfterExecution 的作用

让你在 Job 里面修改的参数(JobDataMap)能被保存下来,下次执行还能继续用。

举个最简单的例子

你有个定时任务,每次执行想让计数器 count +1:

int count = data.getInt("count");
data.put("count", count + 1);

如果 没有 @PersistJobDataAfterExecution:

  • 每次执行 count 都从 0 开始

  • 因为 Quartz 不会把你更新的值保存下来

如果 加上 @PersistJobDataAfterExecution:

  • count 会变成 1、2、3、4...

  • Quartz 会把更新后的值写回数据库

  • 服务重启后 count 也不会丢

只要你在 job 里对 JobDataMap 做写操作,想保存结果 → 就一定要加 @PersistJobDataAfterExecution + @DisallowConcurrentExecution。(防止并发造成的数据覆盖和丢失)

如果你只需要任务被保存,而不需要保存 JobDataMap,可以不加这两个注解。

4. 创建 Job 时必须设置 .storeDurably()

持久化 Job 的关键:

JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").storeDurably()    // ★★★★★ 必须,Job 才会存入数据库.build();

不加 storeDurably() 的 Job 会被当成“临时 Job”,服务重启后会丢失。

Trigger 默认会持久化,不需要额外配置。

5. 服务重启后自动恢复机制

Quartz 启动时会自动从以下表中加载任务:

  • QRTZ_JOB_DETAILS

  • QRTZ_TRIGGERS

  • QRTZ_CRON_TRIGGERS / QRTZ_SIMPLE_TRIGGERS

无需额外代码。

6. 如何验证持久化是否生效

  1. 创建一个 Job + Trigger

  2. 启动服务 → 任务执行正常

  3. 查看数据库 QRTZ_ 前缀的表,是否有记录

  4. 停止服务

  5. 再次启动

  6. 任务是否自动恢复执行

如能恢复,即持久化成功。

参考文章:
【Quartz】(一)定时框架Quartz的持久化配置: https://blog.csdn.net/Jeffhan_java/article/details/123532049

http://www.jsqmd.com/news/68671/

相关文章:

  • [免费]基于Python的深度学习豆瓣电影数据可视化+情感分析推荐环境(Flask+Vue+LSTM+scrapy)【论文+源码+SQL脚本】
  • 2025年12月高端托福封闭班机构调研:无老师国际深度解析
  • TortoiseGit小乌龟下载安装教程
  • nim语言要加分号吗
  • 2025年靠谱的文具铁盒品牌厂家排行榜
  • 2025年冬天大棚订做厂家权威推荐榜单:山东大棚‌/新型养殖大棚‌/连栋大棚源头厂家精选
  • 2025年度佛山建筑陶瓷品牌排行榜推荐——广东和陶家居股份有
  • 闸机租赁:如何选择可靠的源头厂家
  • 2025年中国智能财税服务公司TOP5推荐:九洲财务口碑如何
  • 2025年五大防腐压滤机服务商排行榜,板框压滤机供应企业推荐
  • 2025年建筑陶瓷企业口碑与性价比排名:广东和陶家居股份有限
  • 2025年热门的变压器骨架厂家选购指南与推荐
  • 2025年郑州宠物美容服务/培训推荐排行榜,宠物美容学校哪家
  • 2025年热门的平面贴标机/在线打印贴标机厂家推荐及采购指南
  • 2025年知名的智能道闸厂家实力及用户口碑排行榜
  • 2025 年 12 月宁波网站建设公司权威推荐榜:企业网站/品牌网站/营销网站/外贸独立站,专业定制与优化推广实力之选
  • 2025上海英国留学中介哪家好
  • 2025年飞机盒全版清废机定做厂家权威推荐榜单:纸盒拆标清废机‌/烟包清废机‌/包装盒自动清废机源头厂家精选
  • 2025年评价高的陕西消防设备/西安消防设备实力厂家TOP推荐榜
  • 2025年财税服务公司推荐:九洲财务招聘职业发展与创新服务全
  • 2025年工业电子防潮箱优质厂家权威推荐榜单:半导体电子防潮箱/IC电子防潮箱/防静电防潮箱源头厂家精选
  • 2025深圳英国留学中介排名
  • 2025年度长沙株洲擅长离婚纠纷的律师推荐:看哪家胜诉率高
  • 2025英国出国留学中介机构前十名
  • 2025英国留学机构排名比较靠前的
  • 2025温州家装设计公司TOP5权威推荐:丽园装饰收费合理
  • 2025年热门的彩印包装纸箱/超大幅面彩印包装最新TOP厂家排名
  • 2025年12月SAT辅导机构深度评测:无老师国际VIP定制课程解析
  • 上海十大英国留学中介办理机构名单更新榜
  • 2025年12月北京SAT辅导机构评测:无老师国际VIP定制课程深度解析