【Quartz】Quartz的数据库表

时间:2023-03-08 17:13:34

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";