当前位置: 首页 > 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.rkmt.cn/news/79210.html

相关文章:

  • TortoiseGit小乌龟下载安装教程
  • nim语言要加分号吗
  • 2025年保温聚氨酯高压发泡机实力厂家推荐,看哪家的产品性价
  • 2025年度佛山建筑陶瓷品牌排行榜推荐——广东和陶家居股份有
  • 2025年冬天大棚订做厂家权威推荐榜单:山东大棚‌/新型养殖大棚‌/连栋大棚源头厂家精选
  • 2025年热门的平面贴标机/在线打印贴标机厂家推荐及采购指南
  • 2025深圳英国留学中介排名
  • 2025年度长沙株洲擅长离婚纠纷的律师推荐:看哪家胜诉率高
  • 2025年12月SAT辅导机构深度评测:无老师国际VIP定制课程解析
  • 2025年热门的彩印包装纸箱/超大幅面彩印包装最新TOP厂家排名
  • 上海英国留学中介哪家强看这篇立马不慌
  • 深度揭秘上海英国留学中介排名大公开
  • 2025年12月北京SAT辅导机构评测:无老师国际VIP定制课程深度解析
  • 2025年度专业聚氨酯高压发泡机厂家推荐榜单,看哪家实力强
  • 除尘器靠谱生产商TOP5权威推荐:甄选优质制造商,助力企业达
  • windows 系统查看文件或文件夹被哪个进程占用并解除的方法
  • 2025年12月SAT辅导机构排名:无老师国际VIP定制服务深度解析
  • 2025/12 做题记录
  • 【分布式】Hadoop完全分布式的搭建(零基础) - 实践
  • 行业指南|2025年12月按摩推拿培训学校综合评估:基于师资、课程与就业网络的实力甄选
  • 2025开关柜局部放电监测设备生产厂TOP5权威推荐:技术实
  • 2025压滤机行业售后与口碑TOP5权威测评:京源压滤机在行
  • uv安装配置
  • RL基础概念,多臂bandit
  • 按摩推拿培训学校2025年12月实力榜:教学体系、师资水平与行业认可度深度解析
  • GitLab IP地址更换
  • 详细介绍:Spring 框架整合 JUnit 单元测试——包含完整执行流程
  • 2025年宁波重型机械配件公司实力排名,福美实力怎么样
  • Laravel Blaze:极致性能的Blade组件编译时优化神器
  • 2025年靠谱的单轨电动伸缩门用户口碑最好的厂家榜