quartz集群模式下qrtz_triggers表trigger_state变ERROR分析

最近在正式环境新增了一个定时任务,项目启动后,新增的任务总是跑一两次就不跑了,排查发现trigger_state变为ERROR了。
一、Quartz重要表含义
1)qrtz_calendars:以Blob类型存储Quartz的Calendar日历信息, quartz可配置一个日历来指定一个时间范围。
2)qrtz_cron_triggers:存储Cron Trigger,包括Cron表达式和时区信息。
3)qrtz_fired_triggers:存储已经触发的trigger相关信息,trigger随着时间的推移状态发生变化,直到最后trigger执行完成,从表中被删除。
4)qrtz_job_details:存储每一个已配置的Job的详细信息。
5)qrtz_scheduler_state:存储少量的有关 Scheduler的状态信息,和别的 Scheduler 实例(假如是用于一个集群中)。
6)qrtz_simple_triggers:存储简单的 Trigger,包括重复次数,间隔,以及已触的次数。
7)qrtz_triggers:存储已配置的 Trigger的信息。
二、任务查询
查询qrtz_job_details、qrtz_triggers、qrtz_cron_triggers这三张表即可查到对应定时任务信息。
三、原因分析
1、任务启动后可以正常跑完一次,且在测试时代码正常运行,说明代码是没有问题的;
2、通过更改qrtz_triggers表trigger_state状态为WAITING和next_fire_time(下次触发时间)让任务执行后,一段时间后,trigger_state又变成ERROR,且只有新增任务式这样,其他定时任务都可以正常跑,确定问题出在新的任务上;
3、检查qrtz_scheduler_state表查看是否存在多条记录,如果有多条,只留一条;
4、检查集群环境,或者查看是否有其他环境也和正式环境共用一个数据库,检查后发现,有个备用服务器,并未配置负载均衡,但是用的是正式数据库且上面的应用为启动状态,检查服务器上部署的应用发现服务器上的包并未更新,这个包并不包含新增的任务,关掉备用服务器,发现正式环境上的任务可以正常运行了。
注:
查看任务下次触发时间

select qt.*,to_date('1970-01-01 08:00:00', 'yyyy-mm-dd hh24:mi:ss') +
  qt.next_fire_time / 1000 / 24 / 60 / 60 nextFireTime,sysdate 
from qrtz_triggers qt 

问题总结:
使用quartz集群模式时,若集群节点中应用服务器打的包版本不一致或者其他服务器用非最新版本包且与正式环境共用一个数据库时,就会出现qrtz_triggers表trigger_state变ERROR情况,从而导致定时任务不能正常运行。究其原因quartz执行任务调度是根据数据库表中的记录执行的,如果执行到没有对应代码的节点时,trigger_state就会变成ERROR。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值