如何实现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 执行完,才会执行下一次触发。
阅读全文