转载请注明出处:https://www.cnblogs.com/Dorae/p/9357180.html
本文出自:后端知识点梳理-定时任务Quartz篇章
ClusterManager集群管理线程
每个服务器会定时(org.quartz.jobStore.clusterCheckinInterval这个时间)更新SCHEDULER_STATE表的LAST_CHECKIN_TIME,若这个字段远远超出了该更新的时间,则认为该服务器实例挂了;
注意:每个服务器实例有唯一的id,若配置为AUTO,则为hostname+current_time
线程执行的具体流程:
-
- 检查是否有超时的实例failedInstances;
- 更新该服务器实例的LAST_CHECKIN_TIME;若有超时的实例:
- 获取STATE_ACCESS锁;
- 获取超时的实例failedInstances;
- 获取TRIGGER_ACCESS锁;
- clusterRecover:
- 针对每个failedInstances,通过instanceId获取每个实例的firedTriggers;
- 针对每个firedTrigger:
- 更新trigger状态:
- BLOCKED->WAITING
- PAUSED_BLOCKED->PAUSED
- ACQUIRED->WAITING
- 若firedTrigger不是ACQUIRED状态(在执行状态),且jobRequestRecovery=true:
创建一个SimpleTrigger,存储到trigger表,status=waiting,MISFIRE_INSTR=MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY. - 删除firedTrigger
- 更新trigger状态: