quartz调度出现BLOCKED情况处理

任务状态变化: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,解决办法:设置重试次数

无心插柳,有心吐槽,可以点击进来给我一万点伤害。

你可能感兴趣的:(调度系列)