在使用 Quartz 进行数据库持久化时,Quartz 会自动使用一组数据库表来存储调度信息、任务状态、触发器等数据。这些表用于管理定时任务、触发器、执行历史等内容,并支持任务的持久化和恢复。

1. Quartz 默认需要的表

Quartz 在初始化时,会要求数据库中存在以下一组表,具体表名和结构如下:

1.1 QRTZ_JOB_DETAILS

存储所有调度的任务的详细信息,包括任务名称、描述、所属组等。

表结构

CREATE TABLE QRTZ_JOB_DETAILS (
    SCHED_NAME VARCHAR(120) NOT NULL,
    JOB_NAME VARCHAR(200) NOT NULL,
    JOB_GROUP VARCHAR(200) NOT NULL,
    DESCRIPTION VARCHAR(250) NULL,
    JOB_CLASS_NAME VARCHAR(250) NOT NULL,
    IS_DURABLE BOOLEAN NOT NULL,
    IS_NONCONCURRENT BOOLEAN NOT NULL,
    IS_UPDATE_DATA BOOLEAN NOT NULL,
    REQUESTS_RECOVERY BOOLEAN NOT NULL,
    JOB_DATA BLOB NULL,
    PRIMARY KEY (SCHED_NAME, JOB_NAME, JOB_GROUP)
);
1.2 QRTZ_TRIGGERS

存储触发器的详细信息,包含触发器名称、触发时间、触发条件等。

表结构

CREATE TABLE QRTZ_TRIGGERS (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    JOB_NAME VARCHAR(200) NOT NULL,
    JOB_GROUP VARCHAR(200) NOT NULL,
    DESCRIPTION VARCHAR(250) NULL,
    NEXT_FIRE_TIME BIGINT(13) NULL,
    PREV_FIRE_TIME BIGINT(13) NULL,
    TRIGGER_STATE VARCHAR(16) NOT NULL,
    TRIGGER_TYPE VARCHAR(8) NOT NULL,
    START_TIME BIGINT(13) NOT NULL,
    END_TIME BIGINT(13) NULL,
    CALENDAR_NAME VARCHAR(200) NULL,
    MISFIRE_INSTR INTEGER NOT NULL,
    PRIORITY INTEGER NOT NULL,
    IS_VOLATILE BOOLEAN NOT NULL,
    JOB_DATA BLOB NULL,
    PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
);
1.3 QRTZ_SIMPLE_TRIGGERS

存储 SimpleTrigger 类型的触发器(用于定时执行任务),记录触发器的频率、计数等信息。

表结构

CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    REPEAT_COUNT INTEGER NOT NULL,
    REPEAT_INTERVAL BIGINT(13) NOT NULL,
    TIMES_TRIGGERED INTEGER NOT NULL,
    PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
);
1.4 QRTZ_CRON_TRIGGERS

存储 CronTrigger 类型的触发器(用于按照 CRON 表达式定时执行任务)。

表结构

CREATE TABLE QRTZ_CRON_TRIGGERS (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    CRON_EXPRESSION VARCHAR(120) NOT NULL,
    TIME_ZONE_ID VARCHAR(80) NOT NULL,
    PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
);
1.5 QRTZ_CALENDARS

存储与任务相关的日历信息,用于排除某些特定的日期和时间。

表结构

CREATE TABLE QRTZ_CALENDARS (
    SCHED_NAME VARCHAR(120) NOT NULL,
    CALENDAR_NAME VARCHAR(200) NOT NULL,
    CALENDAR BLOB NOT NULL,
    PRIMARY KEY (SCHED_NAME, CALENDAR_NAME)
);
1.6 QRTZ_PAUSED_TRIGGER_GRPS

存储哪些触发器组已经被暂停。

表结构

CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    PRIMARY KEY (SCHED_NAME, TRIGGER_GROUP)
);
1.7 QRTZ_FIRED_TRIGGERS

存储每次触发器被触发时的相关信息,如触发的时间、任务的执行状态等。

表结构

CREATE TABLE QRTZ_FIRED_TRIGGERS (
    SCHED_NAME VARCHAR(120) NOT NULL,
    ENTRY_ID VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    INSTANCE_NAME VARCHAR(200) NOT NULL,
    FIRED_TIME BIGINT(13) NOT NULL,
    SCHED_TIME BIGINT(13) NOT NULL,
    PRIORITY INTEGER NOT NULL,
    STATE VARCHAR(16) NOT NULL,
    JOB_NAME VARCHAR(200) NOT NULL,
    JOB_GROUP VARCHAR(200) NOT NULL,
    IS_NONCONCURRENT BOOLEAN NOT NULL,
    REQUESTS_RECOVERY BOOLEAN NOT NULL,
    PRIMARY KEY (SCHED_NAME, ENTRY_ID)
);
1.8 QRTZ_JOB_LISTENERS

存储任务监听器信息,任务执行前后的通知机制。

表结构

CREATE TABLE QRTZ_JOB_LISTENERS (
    SCHED_NAME VARCHAR(120) NOT NULL,
    JOB_LISTENER_NAME VARCHAR(200) NOT NULL,
    PRIMARY KEY (SCHED_NAME, JOB_LISTENER_NAME)
);
1.9 QRTZ_TRIGGER_LISTENERS

存储触发器监听器信息。

表结构

CREATE TABLE QRTZ_TRIGGER_LISTENERS (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_LISTENER_NAME VARCHAR(200) NOT NULL,
    PRIMARY KEY (SCHED_NAME, TRIGGER_LISTENER_NAME)
);
1.10 QRTZ_LOCKS

存储 Quartz 调度器锁的相关信息,用于调度系统中的并发控制。

表结构

CREATE TABLE QRTZ_LOCKS (
    SCHED_NAME VARCHAR(120) NOT NULL,
    LOCK_NAME VARCHAR(40) NOT NULL,
    PRIMARY KEY (SCHED_NAME, LOCK_NAME)
);
IS_VOLATILE 字段设置默认值

修改数据库中的 QRTZ_TRIGGERS 表,给 IS_VOLATILE 字段设置一个默认值。这通常是 0(表示 false,非临时触发器)或者 1(表示 true,临时触发器),取决于你的需求。

ALTER TABLE QRTZ_TRIGGERS MODIFY IS_VOLATILE BOOLEAN NOT NULL DEFAULT 0;

这条 SQL 语句会将 IS_VOLATILE 字段的默认值设置为 0,表示触发器默认是持久化的。

2. Quartz 表的作用

这些表的作用分别是:

  • QRTZ_JOB_DETAILS:保存任务的元数据,包括任务的类、持久化标志、任务数据等。
  • QRTZ_TRIGGERS:保存触发器的元数据,控制任务的执行时机。
  • QRTZ_SIMPLE_TRIGGERSQRTZ_CRON_TRIGGERS:分别保存 SimpleTriggerCronTrigger 类型触发器的特定信息。
  • QRTZ_FIRED_TRIGGERS:记录任务触发的执行记录。
  • QRTZ_LOCKS:用于锁机制,避免多个调度器并发执行同一任务。
  • QRTZ_PAUSED_TRIGGER_GRPS:用于保存暂停的触发器组。
  • QRTZ_CALENDARS:存储日历信息,用于排除特定的时间段。
  • QRTZ_JOB_LISTENERSQRTZ_TRIGGER_LISTENERS:用于监听任务和触发器的事件(如任务开始、完成等)。

3. 如何创建这些表

Quartz 提供了不同数据库的创建表的 SQL 脚本。你可以在 Quartz 的 GitHub 仓库或官方文档中找到这些 SQL 脚本,并根据你的数据库类型(如 MySQL、PostgreSQL、Oracle)执行相应的脚本。

也在spingboot配置文件中,配置自动建表

spring:
  quartz:
    jdbc:
      initialize-schema: always #自动建表
    job-store-type: jdbc
    job-store-type: jdbc
    scheduler-name: MyScheduler
    job-factory: org.springframework.scheduling.quartz.SpringBeanJobFactory
    properties:
      org:
        quartz:
          scheduler:
            instanceName: MyScheduler
          threadPool:
            threadCount: 10

4. 总 结

当你在使用 Quartz 时,如果你选择使用 JDBC JobStore(例如 JobStoreTX),这些表会被自动创建并管理任务和触发器。如果你没有自动创建表,或者表丢失,你可以手动运行 Quartz 提供的数据库脚本来创建这些表。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐