quartz定时调度任务触发流程
2022-04-01 17:13:55 0 举报
quartz并发调度流程
作者其他创作
大纲/内容
5.更新dsp_qrtz_fired_triggers点火表状态为EXECUTING
节点A
3.插入dsp_qrtz_fired_triggers点火表
2.更新trigger状态为ACQUIRED(updateTriggerStateFromOtherState)UPDATE dsp_qrtz_triggers SET TRIGGER_STATE = 'ACQUIRED' WHERE SCHED_NAME = 'dspQuartzScheduler' AND TRIGGER_NAME = ?AND TRIGGER_GROUP = 'DSP_JOB' AND TRIGGER_STATE = 'WAITING'
5.更新dsp_qrtz_fired_triggers点火表状态为EXECUTING(font color=\"#ffb74d\
8.事务提交,释放锁
8.将job丢到job执行线程池,发送至业务应用(createJobRunShell)
事务
悲观锁
trigger表状态从WAITING变为ACQUIRED别的线程和调度节点无法再获取到该trigger
trigger表状态从ACQUIRED变为WAITING,释放锁后,其他调度节点又可以获取到该trigger
2.更新trigger状态为ACQUIRED
7.更新dsp_qrtz_triggers表中的下次执行时间,状态为WAITING
7.更新dsp_qrtz_triggers表中的下次执行时间,状态为WAITING(font color=\"#ffb74d\
加锁SELECT * FROM dsp_qrtz_locks WHERE SCHED_NAME = 'dspQuartzScheduler' AND LOCK_NAME = 'TRIGGER_ACCESS' FOR UPDATE
1.获取下次执行时间在30s内的WAITING状态的所有trigger,按触发时间正序排序(font color=\"#ffb74d\
while循环阻塞等待直到最新一条trigger触发时间<=1s
异步执行,执行结束后删除trigger点火表中对应的EXECUTING状态的数据
释放锁conn.commit()
4.再次检查trigger表状态是否为ACQUIRED(selectTriggerState)if (!state.equals(STATE_ACQUIRED)) { return null;}
triggersFired数据库悲观锁
4.事务提交
结束
节点B
6.计算下次执行时间(triggered)
QuartzSchedulerThread.run()
1.获取下次执行时间在30s内的WAITING状态的所有trigger
acquireNextTriggers数据库悲观锁
在次阶段只要节点A的事务没提交,节点B查询到的数据都将和节点A获取到的一致
0 条评论
下一页
为你推荐
查看更多