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