任务状态变化:waiting->blocked->executing->waiting
任务处理过程中,很多次执行任务后,查看任务触发器的状态为BLOCKED,将任务重置为初始状态在执行仍然BLOCKED ,使用的任务重置操作如下:
if (scheduler.checkExists(triggerKey)) {
trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
scheduler.pauseTrigger(trigger.getKey());
scheduler.unscheduleJob(trigger.getKey());
scheduler.deleteJob(trigger.getJobKey());
}
任务状态BLOCKED后,其实任务的状态还是 EXECUTING 的,查看QRTZ_FIRED_TRIGGER表中数据可知。
即使进行重置后,任务的执行状态仍然是EXECUTING,再次执行的任务触发器状态又变成BLOCKED了。
根据查看重置后的任务情况发现,quartz的表QRTZ_TRIGGERS、QUTZ_CRON_TRIGGERS等任务信息表都将任务删除了,唯独QRTZ_FIRED_TRIGGER表中仍然有记录。怀疑这个就是多次执行导致BLOCKED不改变的原因。
任务执行使用的是有状态记录的任务调度。
解决办法:
1、任务状态重置仍然执行
2、增加步骤清理QRTZ_FIRED_TRIGGER表中对应任务执行状态
3、重新执行任务
通过以上流程后,流程执行正常。看来万事解决最好办法就是“重启”。
以上是本次问题处理的过程,如有不同见解,请留言。
另外在解决过程中也查看到不少问题处理,总结如下:
1、线程执行周期长,资源被抢占导致BLOCKED,解决办法:流程调用周期给足时间。
2、执行遇到错误导致BLOCKED,解决办法当然是修改逻辑避免错误
3、访问连接超时导致BLOCKED,解决办法设定访问超时时间
4、有异常重复执行导致BLOCKED,解决办法:设置重试次数
当Quartz调度任务出现BLOCKED状态时,原因是任务执行状态仍为EXECUTING。解决方法包括重置任务、清理QRTZ_FIRED_TRIGGER表、重新执行,以及针对线程超时、错误、连接超时和异常重复执行等问题调整逻辑和配置。重启往往是最后的解决手段。

1万+

被折叠的 条评论
为什么被折叠?



