Quartz执行逻辑(四)触发器状态变成error,任务不执行

本文详细探讨了Quartz框架中trigger状态变为error的原因,涉及触发时机、job信息获取、实例创建失败及任务执行结果对状态的影响。重点解析了触发器状态设置为error的机制和常见场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.介绍

在Quartz执行任务的过程中总是伴随着trigger的状态的改变,当trigger的状态变为error时,这个trigger就永远不会再被触发了,不管是不是还没到endTime。

2.trigger状态变为error的情况

2.1在triggeredTrigger时

在Quartz执行逻辑(一)中说到Quartz在获取到next triggers之后尚未触发,在差不多到时间了之后才去triggered这些triggers,自然此时就需要去获取这些trigger对应的job的信息,调用的是JobStoreSupport中的retrieveJob方法,如下:

 可以看到如果job类找不到会抛一个class  not found的异常,向上查看调用,可以看到在triggedTrigger方法中有对其处理:

 可以看到对retrieveJob方法做了异常的catch处理,catch到JobPersistenceException后会调用updateTriggerState方法把trigger的状态置为error。

2.2初始化JobRunShell实例时

 从代码中可以很直观的看出来在创建JobRunShell实例的过程中抛出异常也会导致trigger的状态被置为error。

2.3执行任务时

在Quartz执行逻辑(一)中说到了最后创建的JobRunShell实例是交由线程池去执行的,如果执行失败则trigger的状态也会被置为error

 从注释也不难看出这种情况出现的原因是什么。

2.4任务执行结束之后

从2.2创建JobRunShell实例出错调用的改变trigger状态的方法:triggeredJobComplete,不难看出任务执行结束后会根据job执行的结果code去更新trigger的state的时候有几率把状态更新为error。关于这部分的逻辑在Quartz执行逻辑(一)中有说明,下面看一下triggeredJobComplete方法中哪些情况会把trigger的state更新为error:

 从代码中不难看出,当结果code为SET_TRIGGER_ERROR或SET_ALL_JOB_TRIGGERS_ERROR时,会把触发器的状态置为ERROR。那么这个intCode是怎么来的呢,在JobRunShell的run方法中可以看到:

是通过trigger的executionComplete方法得到的,该方法里的逻辑比较简单,都是if-else,有必要的可以自己看一下。

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卷福。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值