【Quartz】Quartz的数据库表

select * from test.QRTZ_TRIGGERS 触发器表

select * from QRTZ_PAUSED_TRIGGER_GRPS 暂停的分组任务表

select * from QRTZ_LOCKS 锁表

select * from QRTZ_JOB_DETAILS 任务表详情((调度名字和分组和job名字唯一决定一个job))

select * from QRTZ_FIRED_TRIGGERS  任务执行详情

[1]插入一个任务

1、先从LOCKS中获取行级锁,锁标识(TRIGGER_ACCESS)

2、查看是否存在JOB_DETAILS,不存在保存

3、查看是否存在TRIGGERS

      ->判断当前分组是否暂停PAUSED_TRIGGER_GRPS,或所有分组是否暂停。如暂停,TRIGGERS为PAUSED

      ->如果当前定时任务,不允许执行,则去FIRED_TRIGGERS里查询其状态。其状态,为TRIGGERS的状态。(当前TRIGGERS状态不为WAITING和PAUSED,则返回当天状态,如果)

4、保存TRIGGERS(保存的时候,其状态很重要,依赖PAUSED_TRIGGER_GRPS,FIRED_TRIGGERS里的数据)

5、commit或roball

[2]一次触发任务调度的计划

 1、先从LOCKS中获取行级锁,锁标识(TRIGGER_ACCESS)

 2、访问TRIGGERS,找出最近要执行的,且状态为WAITING的触发器列表。List(triggerName和triggerGroup),再遍历逐个访问TRIGGERS和JOB_DETAILS表

  ->修改TRIGGERS表记录的状态由WATING-ACQUIRED

      ->在FIRED_TRIGGERS表中插入新记录,状态为ACQUIRED

 3、如果出现异常,根据FIRED_TRIGGERS表中的instanceName查询出,所有的FIRED_TRIGGERS记录,验证刚才获取的TRIGGERS列表中是否包含相同instanceName

 4、释放行级锁,锁标识(TRIGGER_ACCESS)

 5、如果达到要执行任务的时间,在此获取TRIGGER_ACCESS

 6,根据要激活List<Triggers>,验证每一条TRIGGERS的状态是否为ACQUIRED(如果存在获取当前状态,如果不存在状态为:DELETED)

     ->如果是,则继续验证JOB_DETAILS

    ->如果不是,返回null

7、验证job,是否存在

8、修改FIRED_TRIGGERS的状态:ACQUIRED->EXECUTING

      --->如果修改验证过程中有异常,则将TRIGGERS的状态从ACQUIRED-->WATIING,并根据instanceName删除FIRED_TRIGGERS里的记录。

9、将TRIGGERS表的状态:ACQUIRED->WATIING

10、释放锁

11、创建内存的JobRunShell,交给工作线程运行。



//等待
String STATE_WAITING = "WAITING";

//获取
String STATE_ACQUIRED = "ACQUIRED";

//执行
String STATE_EXECUTING = "EXECUTING";

//完成
String STATE_COMPLETE = "COMPLETE";

//阻塞
String STATE_BLOCKED = "BLOCKED";

//错误
String STATE_ERROR = "ERROR";

//暂停
String STATE_PAUSED = "PAUSED";

//暂停阻塞
String STATE_PAUSED_BLOCKED = "PAUSED_BLOCKED";

//删除
String STATE_DELETED = "DELETED";

//错过
String STATE_MISFIRED = "MISFIRED";
原文地址:https://www.cnblogs.com/shangxiaofei/p/9307236.html