Quartz任务调度存储与持久化操作配置详细解析

Quartz任务调度(3)存储与持久化操作配置详细解析

摘要: 内存存储RAMJobStore Quartz默认使用RAMJobStore,它的优点是速度。因为所有的 Scheduler 信息都保存在计算机内存中,访问这些数据随着电脑而变快。而无须访问数据库或IO等操作,但它的缺点是将 Job 和 Trigger 信

内存存储RAMJobStore

Quartz默认使用RAMJobStore,它的优点是速度。因为所有的 Scheduler 信息都保存在计算机内存中,访问这些数据随着电脑而变快。而无须访问数据库或IO等操作,但它的缺点是将 Job 和 Trigger 信息存储在内存中的。因而我们每次重启程序,Scheduler 的状态,包括 Job 和 Trigger 信息都丢失了。 
Quartz 的内存 Job 存储的能力是由一个叫做 org.quartz.simple.RAMJobStore 类提供。在我们的quartz-2.x.x.jar包下的org.quartz包下即存储了我们的默认配置quartz.properties。打开这个配置文件,我们会看到如下信息

<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-properties"># Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#

org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false

org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: <span style="color:#ae81ff">10</span>
org.quartz.threadPool.threadPriority: <span style="color:#ae81ff">5</span>
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true

org.quartz.jobStore.misfireThreshold: <span style="color:#ae81ff">60000</span>

org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore #这里默认使用RAMJobStore</code></span></span>

持久性JobStore

Quartz 提供了两种类型的持久性 JobStore,为JobStoreTX和JobStoreCMT,其中: 
1. JobStoreTX为独立环境中的持久性存储,它设计为用于独立环境中。这里的 “独立”,我们是指这样一个环境,在其中不存在与应用容器的事物集成。这里并不意味着你不能在一个容器中使用 JobStoreTX,只不过,它不是设计来让它的事特受容器管理。区别就在于 Quartz 的事物是否要参与到容器的事物中去。 
2. JobStoreCMT 为程序容器中的持久性存储,它设计为当你想要程序容器来为你的 JobStore 管理事物时,并且那些事物要参与到容器管理的事物边界时使用。它的名字明显是来源于容器管理的事物(Container Managed Transactions (CMT))。

持久化配置步骤

要将JobDetail等信息持久化我们的数据库中,我们可按一下步骤操作:

1. 配置数据库

在 /docs/dbTables 目录下存放了几乎所有数据库的的SQL脚本,这里的 是解压 Quartz 分发包后的目录。我们使用常用mysql数据库,下面是示例sql脚本代码

<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-sql"><span style="color:slategray">#</span>
<span style="color:slategray"># Quartz seems to work best with the driver mm.mysql-2.0.7-bin.jar</span>
<span style="color:slategray">#</span>
<span style="color:slategray"># PLEASE consider using mysql with innodb tables to avoid locking issues</span>
<span style="color:slategray">#</span>
<span style="color:slategray"># In your Quartz properties file, you'll need to <span style="color:#f92672">set</span> </span>
<span style="color:slategray"># org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate</span>
<span style="color:slategray">#</span>

<span style="color:#66d9ef"><span style="color:#f92672">DROP</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">IF</span></span> <span style="color:#66d9ef"><span style="color:#f92672">EXISTS</span></span> QRTZ_FIRED_TRIGGERS<span style="color:#f8f8f2">;</span>
<span style="color:#66d9ef"><span style="color:#f92672">DROP</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">IF</span></span> <span style="color:#66d9ef"><span style="color:#f92672">EXISTS</span></span> QRTZ_PAUSED_TRIGGER_GRPS<span style="color:#f8f8f2">;</span>
<span style="color:#66d9ef"><span style="color:#f92672">DROP</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">IF</span></span> <span style="color:#66d9ef"><span style="color:#f92672">EXISTS</span></span> QRTZ_SCHEDULER_STATE<span style="color:#f8f8f2">;</span>
<span style="color:#66d9ef"><span style="color:#f92672">DROP</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">IF</span></span> <span style="color:#66d9ef"><span style="color:#f92672">EXISTS</span></span> QRTZ_LOCKS<span style="color:#f8f8f2">;</span>
<span style="color:#66d9ef"><span style="color:#f92672">DROP</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">IF</span></span> <span style="color:#66d9ef"><span style="color:#f92672">EXISTS</span></span> QRTZ_SIMPLE_TRIGGERS<span style="color:#f8f8f2">;</span>
<span style="color:#66d9ef"><span style="color:#f92672">DROP</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">IF</span></span> <span style="color:#66d9ef"><span style="color:#f92672">EXISTS</span></span> QRTZ_SIMPROP_TRIGGERS<span style="color:#f8f8f2">;</span>
<span style="color:#66d9ef"><span style="color:#f92672">DROP</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">IF</span></span> <span style="color:#66d9ef"><span style="color:#f92672">EXISTS</span></span> QRTZ_CRON_TRIGGERS<span style="color:#f8f8f2">;</span>
<span style="color:#66d9ef"><span style="color:#f92672">DROP</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">IF</span></span> <span style="color:#66d9ef"><span style="color:#f92672">EXISTS</span></span> QRTZ_BLOB_TRIGGERS<span style="color:#f8f8f2">;</span>
<span style="color:#66d9ef"><span style="color:#f92672">DROP</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">IF</span></span> <span style="color:#66d9ef"><span style="color:#f92672">EXISTS</span></span> QRTZ_TRIGGERS<span style="color:#f8f8f2">;</span>
<span style="color:#66d9ef"><span style="color:#f92672">DROP</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">IF</span></span> <span style="color:#66d9ef"><span style="color:#f92672">EXISTS</span></span> QRTZ_JOB_DETAILS<span style="color:#f8f8f2">;</span>
<span style="color:#66d9ef"><span style="color:#f92672">DROP</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">IF</span></span> <span style="color:#66d9ef"><span style="color:#f92672">EXISTS</span></span> QRTZ_CALENDARS<span style="color:#f8f8f2">;</span>


<span style="color:#66d9ef"><span style="color:#f92672">CREATE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> QRTZ_JOB_DETAILS
  <span style="color:#f8f8f2">(</span>
    SCHED_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">80</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    JOB_NAME  <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    JOB_GROUP <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    DESCRIPTION <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    JOB_CLASS_NAME   <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    IS_DURABLE <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    IS_NONCONCURRENT <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    IS_UPDATE_DATA <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    REQUESTS_RECOVERY <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    JOB_DATA <span style="color:#66d9ef"><span style="color:#e6db74">BLOB</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>JOB_NAME<span style="color:#f8f8f2">,</span>JOB_GROUP<span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>

<span style="color:#66d9ef"><span style="color:#f92672">CREATE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> QRTZ_TRIGGERS
  <span style="color:#f8f8f2">(</span>
    SCHED_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">80</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TRIGGER_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TRIGGER_GROUP <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    JOB_NAME  <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    JOB_GROUP <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    DESCRIPTION <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    NEXT_FIRE_TIME <span style="color:#66d9ef"><span style="color:#e6db74">BIGINT</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">13</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    PREV_FIRE_TIME <span style="color:#66d9ef"><span style="color:#e6db74">BIGINT</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">13</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    <span style="color:#f92672">PRIORITY</span> <span style="color:#66d9ef"><span style="color:#e6db74">INTEGER</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TRIGGER_STATE <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">16</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TRIGGER_TYPE <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">8</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    START_TIME <span style="color:#66d9ef"><span style="color:#e6db74">BIGINT</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">13</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    END_TIME <span style="color:#66d9ef"><span style="color:#e6db74">BIGINT</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">13</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    CALENDAR_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    MISFIRE_INSTR <span style="color:#66d9ef"><span style="color:#e6db74">SMALLINT</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">2</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    JOB_DATA <span style="color:#66d9ef"><span style="color:#e6db74">BLOB</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>TRIGGER_NAME<span style="color:#f8f8f2">,</span>TRIGGER_GROUP<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span>
    <span style="color:#66d9ef">FOREIGN</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>JOB_NAME<span style="color:#f8f8f2">,</span>JOB_GROUP<span style="color:#f8f8f2">)</span>
        <span style="color:#66d9ef"><span style="color:#f92672">REFERENCES</span></span> QRTZ_JOB_DETAILS<span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>JOB_NAME<span style="color:#f8f8f2">,</span>JOB_GROUP<span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>

<span style="color:#66d9ef"><span style="color:#f92672">CREATE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> QRTZ_SIMPLE_TRIGGERS
  <span style="color:#f8f8f2">(</span>
    SCHED_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">80</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TRIGGER_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TRIGGER_GROUP <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    REPEAT_COUNT <span style="color:#66d9ef"><span style="color:#e6db74">BIGINT</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">7</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    REPEAT_INTERVAL <span style="color:#66d9ef"><span style="color:#e6db74">BIGINT</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">12</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TIMES_TRIGGERED <span style="color:#66d9ef"><span style="color:#e6db74">BIGINT</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">10</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>TRIGGER_NAME<span style="color:#f8f8f2">,</span>TRIGGER_GROUP<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span>
    <span style="color:#66d9ef">FOREIGN</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>TRIGGER_NAME<span style="color:#f8f8f2">,</span>TRIGGER_GROUP<span style="color:#f8f8f2">)</span>
        <span style="color:#66d9ef"><span style="color:#f92672">REFERENCES</span></span> QRTZ_TRIGGERS<span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>TRIGGER_NAME<span style="color:#f8f8f2">,</span>TRIGGER_GROUP<span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>

<span style="color:#66d9ef"><span style="color:#f92672">CREATE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> QRTZ_CRON_TRIGGERS
  <span style="color:#f8f8f2">(</span>
    SCHED_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">80</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TRIGGER_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TRIGGER_GROUP <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    CRON_EXPRESSION <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TIME_ZONE_ID <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">80</span></span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span>
    <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>TRIGGER_NAME<span style="color:#f8f8f2">,</span>TRIGGER_GROUP<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span>
    <span style="color:#66d9ef">FOREIGN</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>TRIGGER_NAME<span style="color:#f8f8f2">,</span>TRIGGER_GROUP<span style="color:#f8f8f2">)</span>
        <span style="color:#66d9ef"><span style="color:#f92672">REFERENCES</span></span> QRTZ_TRIGGERS<span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>TRIGGER_NAME<span style="color:#f8f8f2">,</span>TRIGGER_GROUP<span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>

<span style="color:#66d9ef"><span style="color:#f92672">CREATE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> QRTZ_SIMPROP_TRIGGERS
  <span style="color:#f8f8f2">(</span>          
    SCHED_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">80</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TRIGGER_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TRIGGER_GROUP <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    STR_PROP_1 <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">120</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    STR_PROP_2 <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">120</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    STR_PROP_3 <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">120</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    INT_PROP_1 <span style="color:#66d9ef"><span style="color:#e6db74">INT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    INT_PROP_2 <span style="color:#66d9ef"><span style="color:#e6db74">INT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    LONG_PROP_1 <span style="color:#66d9ef"><span style="color:#e6db74">BIGINT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    LONG_PROP_2 <span style="color:#66d9ef"><span style="color:#e6db74">BIGINT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    DEC_PROP_1 <span style="color:#66d9ef"><span style="color:#e6db74">NUMERIC</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">13</span></span><span style="color:#f8f8f2">,</span><span style="color:#ae81ff"><span style="color:#ae81ff">4</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    DEC_PROP_2 <span style="color:#66d9ef"><span style="color:#e6db74">NUMERIC</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">13</span></span><span style="color:#f8f8f2">,</span><span style="color:#ae81ff"><span style="color:#ae81ff">4</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    BOOL_PROP_1 <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    BOOL_PROP_2 <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>TRIGGER_NAME<span style="color:#f8f8f2">,</span>TRIGGER_GROUP<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span>
    <span style="color:#66d9ef">FOREIGN</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>TRIGGER_NAME<span style="color:#f8f8f2">,</span>TRIGGER_GROUP<span style="color:#f8f8f2">)</span> 
    <span style="color:#66d9ef"><span style="color:#f92672">REFERENCES</span></span> QRTZ_TRIGGERS<span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>TRIGGER_NAME<span style="color:#f8f8f2">,</span>TRIGGER_GROUP<span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>

<span style="color:#66d9ef"><span style="color:#f92672">CREATE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> QRTZ_BLOB_TRIGGERS
  <span style="color:#f8f8f2">(</span>
    SCHED_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">80</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TRIGGER_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TRIGGER_GROUP <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    BLOB_DATA <span style="color:#66d9ef"><span style="color:#e6db74">BLOB</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>TRIGGER_NAME<span style="color:#f8f8f2">,</span>TRIGGER_GROUP<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span>
    <span style="color:#66d9ef">FOREIGN</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>TRIGGER_NAME<span style="color:#f8f8f2">,</span>TRIGGER_GROUP<span style="color:#f8f8f2">)</span>
        <span style="color:#66d9ef"><span style="color:#f92672">REFERENCES</span></span> QRTZ_TRIGGERS<span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>TRIGGER_NAME<span style="color:#f8f8f2">,</span>TRIGGER_GROUP<span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>

<span style="color:#66d9ef"><span style="color:#f92672">CREATE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> QRTZ_CALENDARS
  <span style="color:#f8f8f2">(</span>
    SCHED_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">80</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    CALENDAR_NAME  <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    CALENDAR <span style="color:#66d9ef"><span style="color:#e6db74">BLOB</span></span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>CALENDAR_NAME<span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>

<span style="color:#66d9ef"><span style="color:#f92672">CREATE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> QRTZ_PAUSED_TRIGGER_GRPS
  <span style="color:#f8f8f2">(</span>
    SCHED_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">80</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TRIGGER_GROUP  <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span> 
    <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>TRIGGER_GROUP<span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>

<span style="color:#66d9ef"><span style="color:#f92672">CREATE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> QRTZ_FIRED_TRIGGERS
  <span style="color:#f8f8f2">(</span>
    SCHED_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">80</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    ENTRY_ID <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">95</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TRIGGER_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    TRIGGER_GROUP <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    INSTANCE_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    FIRED_TIME <span style="color:#66d9ef"><span style="color:#e6db74">BIGINT</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">13</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    SCHED_TIME <span style="color:#66d9ef"><span style="color:#e6db74">BIGINT</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">13</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    <span style="color:#f92672">PRIORITY</span> <span style="color:#66d9ef"><span style="color:#e6db74">INTEGER</span></span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    STATE <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">16</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    JOB_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    JOB_GROUP <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    IS_NONCONCURRENT <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    REQUESTS_RECOVERY <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">)</span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>ENTRY_ID<span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>

<span style="color:#66d9ef"><span style="color:#f92672">CREATE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> QRTZ_SCHEDULER_STATE
  <span style="color:#f8f8f2">(</span>
    SCHED_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">80</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    INSTANCE_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">100</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    LAST_CHECKIN_TIME <span style="color:#66d9ef"><span style="color:#e6db74">BIGINT</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">13</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    CHECKIN_INTERVAL <span style="color:#66d9ef"><span style="color:#e6db74">BIGINT</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">13</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>INSTANCE_NAME<span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>

<span style="color:#66d9ef"><span style="color:#f92672">CREATE</span></span> <span style="color:#66d9ef"><span style="color:#f92672">TABLE</span></span> QRTZ_LOCKS
  <span style="color:#f8f8f2">(</span>
    SCHED_NAME <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">80</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span>
    LOCK_NAME  <span style="color:#66d9ef"><span style="color:#e6db74">VARCHAR</span></span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">40</span></span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2"><span style="color:#f92672">NOT</span></span> <span style="color:#ae81ff"><span style="color:#ae81ff">NULL</span></span><span style="color:#f8f8f2">,</span> 
    <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef"><span style="color:#f92672">KEY</span></span> <span style="color:#f8f8f2">(</span>SCHED_NAME<span style="color:#f8f8f2">,</span>LOCK_NAME<span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>

<span style="color:#66d9ef"><span style="color:#f92672">commit</span></span><span style="color:#f8f8f2">;</span></code></span></span>

其中各表的含义如下所示:

表名描述
QRTZ_CALENDARS以 Blob 类型存储 Quartz 的 Calendar 信息
QRTZ_CRON_TRIGGERS存储 Cron Trigger,包括 Cron 表达式和时区信息
QRTZ_FIRED_TRIGGERS存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息
QRTZ_PAUSED_TRIGGER_GRPS存储已暂停的 Trigger 组的信息
QRTZ_SCHEDULER_STATE存储少量的有关 Scheduler 的状态信息,和别的 Scheduler 实例(假如是用于一个集群中)
QRTZ_LOCKS存储程序的非观锁的信息(假如使用了悲观锁)
QRTZ_JOB_DETAILS存储每一个已配置的 Job 的详细信息
QRTZ_JOB_LISTENERS存储有关已配置的 JobListener 的信息
QRTZ_SIMPLE_TRIGGERS存储简单的 Trigger,包括重复次数,间隔,以及已触的次数
QRTZ_BLOG_TRIGGERS Trigger作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)
QRTZ_TRIGGER_LISTENERS存储已配置的 TriggerListener 的信息
QRTZ_TRIGGERS存储已配置的 Trigger 的信息

2. 使用JobStoreTX

  1. 首先,我们需要在我们的属性文件中表明使用JobStoreTX: 
    org.quartz.jobStore.class = org.quartz.ompl.jdbcjobstore.JobStoreTX
  2. 然后我们需要配置能理解不同数据库系统中某一特定方言的驱动代理:
数据库平台Quartz 代理类
Cloudscape/Derbyorg.quartz.impl.jdbcjobstore.CloudscapeDelegate
DB2 (version 6.x)org.quartz.impl.jdbcjobstore.DB2v6Delegate
DB2 (version 7.x)org.quartz.impl.jdbcjobstore.DB2v7Delegate
DB2 (version 8.x)org.quartz.impl.jdbcjobstore.DB2v8Delegate
HSQLDBorg.quartz.impl.jdbcjobstore.PostgreSQLDelegate
MS SQL Serverorg.quartz.impl.jdbcjobstore.MSSQLDelegate
Pointbaseorg.quartz.impl.jdbcjobstore.PointbaseDelegate
PostgreSQLorg.quartz.impl.jdbcjobstore.PostgreSQLDelegate
(WebLogic JDBC Driver)org.quartz.impl.jdbcjobstore.WebLogicDelegate
(WebLogic 8.1 with Oracle)org.quartz.impl.jdbcjobstore.oracle.weblogic.WebLogicOracleDelegate
Oracleorg.quartz.impl.jdbcjobstore.oracle.OracleDelegate

如果我们的数据库平台没在上面列出,那么最好的选择就是,直接使用标准的 JDBC 代理 org.quartz.impl.jdbcjobstore.StdDriverDelegate 就能正常的工作。

  1. 以下是一些相关常用的配置属性及其说明:
属性默认值描述
org.quartz.jobStore.dataSource用于 quartz.properties 中数据源的名称
org.quartz.jobStore.tablePrefixQRTZ_指定用于 Scheduler 的一套数据库表名的前缀。假如有不同的前缀,Scheduler 就能在同一数据库中使用不同的表。
org.quartz.jobStore.userPropertiesFalse“use properties” 标记指示着持久性 JobStore 所有在 JobDataMap 中的值都是字符串,因此能以 名-值 对的形式存储,而不用让更复杂的对象以序列化的形式存入 BLOB 列中。这样会更方便,因为让你避免了发生于序列化你的非字符串的类到 BLOB 时的有关类版本的问题。
org.quartz.jobStore.misfireThreshold60000在 Trigger 被认为是错过触发之前,Scheduler 还容许 Trigger 通过它的下次触发时间的毫秒数。默认值(假如你未在配置中存在这一属性条目) 是 60000(60 秒)。这个不仅限于 JDBC-JobStore;它也可作为 RAMJobStore 的参数
org.quartz.jobStore.isClusteredFalse设置为 true 打开集群特性。如果你有多个 Quartz 实例在用同一套数据库时,这个属性就必须设置为 true。
org.quartz.jobStore.clusterCheckinInterval15000设置一个频度(毫秒),用于实例报告给集群中的其他实例。这会影响到侦测失败实例的敏捷度。它只用于设置了 isClustered 为 true 的时候。
org.quartz.jobStore.maxMisfiresToHandleAtATime20这是 JobStore 能处理的错过触发的 Trigger 的最大数量。处理太多(超过两打) 很快会导致数据库表被锁定够长的时间,这样就妨碍了触发别的(还未错过触发) trigger 执行的性能。
org.quartz.jobStore.dontSetAutoCommitFalseFalse设置这个参数为 true 会告诉 Quartz 从数据源获取的连接后不要调用它的 setAutoCommit(false) 方法。这在少些情况下是有帮助的,比如假如你有这样一个驱动,它会抱怨本来就是关闭的又来调用这个方法。这个属性默认值是 false,因为大多数的驱动都要求调用 setAutoCommit(false)。
org.quartz.jobStore.selectWithLockSQLSELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE这必须是一个从 LOCKS 表查询一行并对这行记录加锁的 SQL 语句。假如未设置,默认值就是 SELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE,这能在大部分数据库上工作。{0} 会在运行期间被前面你配置的 TABLE_PREFIX 所替换。
org.quartz.jobStore.txIsolationLevelSerializableFalse值为 true 时告知 Quartz(当使用 JobStoreTX 或 CMT) 调用 JDBC 连接的 setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE) 方法。这有助于阻止某些数据库在高负载和长时间事物时锁的超时。

4. 我们还需要配置Datasource 属性

属性必须说明
org.quartz.dataSource.NAME.driverJDBC 驱动类的全限名
org.quartz.dataSource.NAME.URL连接到你的数据库的 URL(主机,端口等)
org.quartz.dataSource.NAME.user用于连接你的数据库的用户名
org.quartz.dataSource.NAME.password用于连接你的数据库的密码
org.quartz.dataSource.NAME.maxConnectionsDataSource 在连接接中创建的最大连接数
org.quartz.dataSource.NAME.validationQuary一个可选的 SQL 查询字串,DataSource 用它来侦测并替换失败/断开的连接。例如,Oracle 用户可选用 select table_name from user_tables,这个查询应当永远不会失败,除非直的就是连接不上了。

下面是我们的一个quartz.properties属性文件配置实例:

<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-xml">org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.dataSource = myDS

org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/quartz?characterEncoding=utf-8
org.quartz.dataSource.myDS.user = root
org.quartz.dataSource.myDS.password = root
org.quartz.dataSource.myDS.maxConnections =5</code></span></span>

配置好quartz.properties属性文件后,我们只要**将它放在类路径下,然后运行我们的程序,即可覆盖在quartz.jar包中默认的配置文件

3. 测试

编写我们的测试文件,我们的测试环境是在quartz-2.2.2版本下进行的。下面的测试用例引用了上篇文章 ,关于Quartz的快速入门配置可移步参考这篇文章。

<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-java"><span style="color:#66d9ef"><span style="color:#f92672">public</span></span> <span style="color:#66d9ef"><span style="color:#f92672">class</span></span> <span style="color:#f8f8f2">pickNewsJob</span> <span style="color:#66d9ef"><span style="color:#f92672">implements</span></span> <span style="color:#f8f8f2">Job</span> <span style="color:#f8f8f2">{</span>

    <span style="color:#75715e">@Override</span>
    <span style="color:#66d9ef"><span style="color:#f92672">public</span></span> <span style="color:#66d9ef"><span style="color:#f92672">void</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">execute</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">JobExecutionContext jec</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span> <span style="color:#66d9ef"><span style="color:#f92672">throws</span></span> JobExecutionException <span style="color:#f8f8f2">{</span>
        SimpleDateFormat sdf <span style="color:#f8f8f2">=</span> <span style="color:#66d9ef"><span style="color:#f92672">new</span></span> SimpleDateFormat<span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">"HH:mm:ss"</span></span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
        System<span style="color:#f8f8f2">.</span>out<span style="color:#f8f8f2">.</span><span style="color:#e6db74">println</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">"在"</span></span><span style="color:#f8f8f2">+</span>sdf<span style="color:#f8f8f2">.</span><span style="color:#e6db74">format</span><span style="color:#f8f8f2">(</span><span style="color:#66d9ef"><span style="color:#f92672">new</span></span> Date<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">+</span><span style="color:#a6e22e"><span style="color:#e6db74">"扒取新闻"</span></span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
    <span style="color:#f8f8f2">}</span>

    <span style="color:#66d9ef"><span style="color:#f92672">public</span></span> <span style="color:#66d9ef"><span style="color:#f92672">static</span></span> <span style="color:#66d9ef"><span style="color:#f92672">void</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">main</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2">String args</span><span style="color:#f8f8f2"><span style="color:#f8f8f2">[</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">]</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span> <span style="color:#66d9ef"><span style="color:#f92672">throws</span></span> SchedulerException <span style="color:#f8f8f2">{</span>
        JobDetail jobDetail <span style="color:#f8f8f2">=</span> JobBuilder<span style="color:#f8f8f2">.</span><span style="color:#e6db74">newJob</span><span style="color:#f8f8f2">(</span>pickNewsJob<span style="color:#f8f8f2">.</span><span style="color:#66d9ef">class</span><span style="color:#f8f8f2">)</span>
                <span style="color:#f8f8f2">.</span><span style="color:#e6db74">withIdentity</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">"job1"</span></span><span style="color:#f8f8f2">,</span> <span style="color:#a6e22e"><span style="color:#e6db74">"jgroup1"</span></span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">build</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
        SimpleTrigger simpleTrigger <span style="color:#f8f8f2">=</span> TriggerBuilder
                <span style="color:#f8f8f2">.</span><span style="color:#e6db74">newTrigger</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span>
                <span style="color:#f8f8f2">.</span><span style="color:#e6db74">withIdentity</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">"trigger1"</span></span><span style="color:#f8f8f2">)</span>
                <span style="color:#f8f8f2">.</span><span style="color:#e6db74">withSchedule</span><span style="color:#f8f8f2">(</span>SimpleScheduleBuilder<span style="color:#f8f8f2">.</span><span style="color:#e6db74">repeatSecondlyForTotalCount</span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff"><span style="color:#ae81ff">10</span></span><span style="color:#f8f8f2">,</span> <span style="color:#ae81ff"><span style="color:#ae81ff">2</span></span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span>
                <span style="color:#f8f8f2">.</span><span style="color:#e6db74">startNow</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span>
                <span style="color:#f8f8f2">.</span><span style="color:#e6db74">build</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>

        <span style="color:slategray"><span style="color:#75715e">//创建scheduler</span></span>
        SchedulerFactory schedulerFactory <span style="color:#f8f8f2">=</span> <span style="color:#66d9ef"><span style="color:#f92672">new</span></span> StdSchedulerFactory<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
        Scheduler scheduler <span style="color:#f8f8f2">=</span> schedulerFactory<span style="color:#f8f8f2">.</span><span style="color:#e6db74">getScheduler</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
        scheduler<span style="color:#f8f8f2">.</span><span style="color:#e6db74">scheduleJob</span><span style="color:#f8f8f2">(</span>jobDetail<span style="color:#f8f8f2">,</span> simpleTrigger<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
        scheduler<span style="color:#f8f8f2">.</span><span style="color:#e6db74">start</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
    <span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span></code></span></span>

执行测试方法,能看到控制台打印如下日志信息,关注红色部分,更注意其中的粗体部分,是我们quartz调用数据库的一些信息:

INFO : org.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl 
INFO : org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.2.2 created. 
INFO : org.quartz.impl.jdbcjobstore.JobStoreTX - Using thread monitor-based data access locking (synchronization). 
INFO : org.quartz.impl.jdbcjobstore.JobStoreTX - JobStoreTX initialized. 
INFO : org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.2) ‘MyScheduler’ with instanceId ‘NON_CLUSTERED’ 
Scheduler class: ‘org.quartz.core.QuartzScheduler’ - running locally. 
NOT STARTED. 
Currently in standby mode. 
Number of jobs executed: 0 
Using thread pool ‘org.quartz.simpl.SimpleThreadPool’ - with 3 threads. 
Using job-store ‘org.quartz.impl.jdbcjobstore.JobStoreTX’ - which supports persistence. and is not clustered. 

INFO : org.quartz.impl.StdSchedulerFactory - Quartz scheduler ‘MyScheduler’ initialized from default resource file in Quartz package: ‘quartz.properties’ 
INFO : org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.2.2 
INFO : com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource - Initializing c3p0 pool… com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> z8kfsx9f1dp34iubvoy4d|7662953a, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> z8kfsx9f1dp34iubvoy4d|7662953a, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://localhost:3306/quartz?characterEncoding=utf-8, lastAcquisitionFailureDefaultUser -> null, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 5, maxStatements -> 0, maxStatementsPerConnection -> 120, minPoolSize -> 1, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ] 
INFO : org.quartz.impl.jdbcjobstore.JobStoreTX - Freed 0 triggers from ‘acquired’ / ‘blocked’ state. 
INFO : org.quartz.impl.jdbcjobstore.JobStoreTX - Recovering 0 jobs that were in-progress at the time of the last shut-down.这里代表在我们任务开始时,先从数据库查询旧记录,这些旧记录是之前由于程序中断等原因未能正常执行的,于是先Recovery回来并执行 
INFO : org.quartz.impl.jdbcjobstore.JobStoreTX - Recovery complete. 
INFO : org.quartz.impl.jdbcjobstore.JobStoreTX - Removed 0 ‘complete’ triggers. 
INFO : org.quartz.impl.jdbcjobstore.JobStoreTX - Removed 0 stale fired job entries. 


INFO : org.quartz.core.QuartzScheduler - Scheduler MyScheduler_$_NON_CLUSTERED started. 
在21:28:12扒取新闻 
在21:28:13扒取新闻 
在21:28:15扒取新闻 
在21:28:17扒取新闻 
….

4. 拓展测试

我们再次运行测试方法,然后马上中断程序,查询我们数据库,会看到如下内容: 
SELECT * FROM QRTZ_SIMPLE_TRIGGERS; 
+————-+————–+—————+————–+—————–+—————–+ 
| SCHED_NAME | TRIGGER_NAME | TRIGGER_GROUP | REPEAT_COUNT | REPEAT_INTERVAL | TIMES_TRIGGERED | 
+————-+————–+—————+————–+—————–+—————–+ 
| MyScheduler | trigger1 | DEFAULT | 9 | 2000 | 1 | 
+————-+————–+—————+————–+—————–+—————–+ 
1 row in set (0.00 sec)

然后我们再运行程序,发现报错了。 
org.quartz.ObjectAlreadyExistsException: Unable to store Job : ‘jgroup1.job1’, because one already exists with this identification. 
一般的,在我们的任务调度前,会先将相关的任务持久化到数据库中,然后调用完在删除记录,这里在程序开始试图将任务信息持久化到数据库时,显然和(因为我们之前中断操作导致)数据库中存在的记录起了冲突。

5. 恢复异常中断的任务

这个时候,我们可以选择修改我们的job名和组名和triiger名,然后再运行我们的程序。查看控制台打印的信息部分展示如下:

INFO : org.quartz.impl.jdbcjobstore.JobStoreTX - Freed 1 triggers from ‘acquired’ / ‘blocked’ state. 
INFO : org.quartz.impl.jdbcjobstore.JobStoreTX - Handling 1 trigger(s) that missed their scheduled fire-time.这里我们开始处理上一次异常未完成的存储在数据库中的任务记录 
INFO : org.quartz.impl.jdbcjobstore.JobStoreTX - Recovering 0 jobs that were in-progress at the time of the last shut-down. 
INFO : org.quartz.impl.jdbcjobstore.JobStoreTX - Recovery complete. 
INFO : org.quartz.impl.jdbcjobstore.JobStoreTX - Removed 0 ‘complete’ triggers. 
INFO : org.quartz.impl.jdbcjobstore.JobStoreTX - Removed 1 stale fired job entries. 
INFO : org.quartz.core.QuartzScheduler - Scheduler MyScheduler_$_NON_CLUSTERED started. 
在21:42:13扒取新闻 
在21:42:13扒取新闻 
在21:42:14扒取新闻 
在21:42:15扒取新闻 
在21:42:16扒取新闻 
在21:42:17扒取新闻 
在21:42:18扒取新闻 
在21:42:19扒取新闻 
在21:42:20扒取新闻 
在21:42:21扒取新闻 
在21:42:22扒取新闻 
在21:42:23扒取新闻 
在21:42:24扒取新闻 
在21:42:25扒取新闻 
在21:42:26扒取新闻 
在21:42:27扒取新闻 
在21:42:28扒取新闻 
在21:42:29扒取新闻 
在21:42:30扒取新闻 
我们会发现,“扒取新闻”一句的信息打印次数超过十次,但我们在任务调度中设置了打印十次,说明它恢复了上次的任务调度。 
而如果我们不想执行新的任务,只想纯粹地恢复之前异常中断任务,我们可以采用如下方法:

<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-java">SchedulerFactory schedulerFactory <span style="color:#f8f8f2">=</span> <span style="color:#66d9ef"><span style="color:#f92672">new</span></span> StdSchedulerFactory<span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
    Scheduler scheduler <span style="color:#f8f8f2">=</span> schedulerFactory<span style="color:#f8f8f2">.</span><span style="color:#e6db74">getScheduler</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
    <span style="color:slategray"><span style="color:#75715e">// ①获取调度器中所有的触发器组</span></span>
    List<span style="color:#f8f8f2"><</span>String<span style="color:#f8f8f2">></span> triggerGroups <span style="color:#f8f8f2">=</span> scheduler<span style="color:#f8f8f2">.</span><span style="color:#e6db74">getTriggerGroupNames</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
    <span style="color:slategray"><span style="color:#75715e">// ②重新恢复在tgroup1组中,名为trigger1触发器的运行</span></span>
    <span style="color:#66d9ef"><span style="color:#f92672">for</span></span> <span style="color:#f8f8f2">(</span><span style="color:#66d9ef"><span style="color:#f92672">int</span></span> i <span style="color:#f8f8f2">=</span> <span style="color:#ae81ff"><span style="color:#ae81ff">0</span></span><span style="color:#f8f8f2">;</span> i <span style="color:#f8f8f2"><</span> triggerGroups<span style="color:#f8f8f2">.</span><span style="color:#e6db74">size</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span> i<span style="color:#f8f8f2">++</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span><span style="color:slategray"><span style="color:#75715e">//这里使用了两次遍历,针对每一组触发器里的每一个触发器名,和每一个触发组名进行逐次匹配</span></span>
        List<span style="color:#f8f8f2"><</span>String<span style="color:#f8f8f2">></span> triggers <span style="color:#f8f8f2">=</span> scheduler<span style="color:#f8f8f2">.</span><span style="color:#e6db74">getTriggerGroupNames</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
        <span style="color:#66d9ef"><span style="color:#f92672">for</span></span> <span style="color:#f8f8f2">(</span><span style="color:#66d9ef"><span style="color:#f92672">int</span></span> j <span style="color:#f8f8f2">=</span> <span style="color:#ae81ff"><span style="color:#ae81ff">0</span></span><span style="color:#f8f8f2">;</span> j <span style="color:#f8f8f2"><</span> triggers<span style="color:#f8f8f2">.</span><span style="color:#e6db74">size</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span> j<span style="color:#f8f8f2">++</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
            Trigger tg <span style="color:#f8f8f2">=</span> scheduler<span style="color:#f8f8f2">.</span><span style="color:#e6db74">getTrigger</span><span style="color:#f8f8f2">(</span><span style="color:#66d9ef"><span style="color:#f92672">new</span></span> TriggerKey<span style="color:#f8f8f2">(</span>triggers
                    <span style="color:#f8f8f2">.</span><span style="color:#e6db74">get</span><span style="color:#f8f8f2">(</span>j<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span> triggerGroups<span style="color:#f8f8f2">.</span><span style="color:#e6db74">get</span><span style="color:#f8f8f2">(</span>i<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
            <span style="color:slategray"><span style="color:#75715e">// ②-1:根据名称判断</span></span>
            <span style="color:#66d9ef"><span style="color:#f92672">if</span></span> <span style="color:#f8f8f2">(</span>tg <span style="color:#66d9ef"><span style="color:#f92672">instanceof</span></span> SimpleTrigger
                    <span style="color:#f8f8f2">&&</span> tg<span style="color:#f8f8f2">.</span><span style="color:#e6db74">getDescription</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">equals</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">"jgroup1.DEFAULT"</span></span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span><span style="color:slategray"><span style="color:#75715e">//由于我们之前测试没有设置触发器所在组,所以默认为DEFAULT</span></span>
                <span style="color:slategray"><span style="color:#75715e">// ②-1:恢复运行</span></span>
                scheduler<span style="color:#f8f8f2">.</span><span style="color:#e6db74">resumeJob</span><span style="color:#f8f8f2">(</span><span style="color:#66d9ef"><span style="color:#f92672">new</span></span> JobKey<span style="color:#f8f8f2">(</span>triggers<span style="color:#f8f8f2">.</span><span style="color:#e6db74">get</span><span style="color:#f8f8f2">(</span>j<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span>
                        triggerGroups<span style="color:#f8f8f2">.</span><span style="color:#e6db74">get</span><span style="color:#f8f8f2">(</span>i<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
            <span style="color:#f8f8f2">}</span>
        <span style="color:#f8f8f2">}</span>
    <span style="color:#f8f8f2">}</span>
    scheduler<span style="color:#f8f8f2">.</span><span style="color:#e6db74">start</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
<span style="color:#f8f8f2">}</span></code></span></span>

调用此方法,我们在数据库中异常中断任务记录就会被读取执行,然后被删除掉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值