如何实现Quartz定时任务在服务重启后自动恢复的持久化存储?
摘要:Quartz 定时任务持久化(重启后自动恢复) 声明: 本文内容由 ChatGPT 协助生成,仅作为个人学习与记录之用。 Quartz 默认使用 RAMJobStore(内存存储),服务重启后任务会丢失。 要让定时任务在重启后仍然有效,必须
Quartz 定时任务持久化(重启后自动恢复)
声明: 本文内容由 ChatGPT 协助生成,仅作为个人学习与记录之用。
Quartz 默认使用 RAMJobStore(内存存储),服务重启后任务会丢失。
要让定时任务在重启后仍然有效,必须启用:JDBCJobStore(数据库持久化)
本文说明如何在 Spring Boot 项目中配置 Quartz 持久化,使任务存入数据库并在重启后自动恢复。
1. 启用 Quartz 持久化(application.yml)
示例配置:
spring:
quartz:
job-store-type: jdbc # 启用数据库持久化
jdbc:
initialize-schema: always # 第一次启动自动建表,之后改为 never
properties:
org.quartz.scheduler.instanceName: QuartzScheduler
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.useProperties: false
org.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 执行完,才会执行下一次触发。
