记一次使用Quartz集群环境下,trigger_state error问题原因

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

项目场景:

项目里采用的定时任务是Quartz,配置的是集群持久化,多台节点连接同一个数据库。


问题描述:

新加的定时任务,跑了一两次就不执行了。一查询该任务的触发器状态变成ERROR,日志报Couldn’t retrieve job because a required class was not found;


原因分析:

因为是集群,有多个节点。报这个错误的意思是有节点执行定时任务时没有找到定时器的类,所以就把该定时任务的触发器的状态置为了ERROR。

可能的原因就是节点代码版本不一致。但是我反复确认了一下,代码版本都是一致的,后来我查询qrtz_job_details表一看,终于找到了问题所在,存在表里的job_class_name字段是代理类的路径。这就奇了怪了,为什么构建job信息获取bean的是代理类的路径。 在这里插入图片描述 在这里插入图片描述 一看是动态代理,应该是使用springAOP出现的问题。再一看项目里原来用AOP设置了切面进行异常日志的记录,拦截了所有的业务目录下的包。 在这里插入图片描述


解决方案:

在切面注解里排除掉定时任务的类,重启启动,在创建定时任务时获取到的就是路径正常了,定时任务也正常执行了。 在这里插入图片描述

虽然是解决了问题,但其中的原理还是不清楚,有知道的小伙伴吗?欢迎评论区留下宝贵的意见

猜你喜欢

转载自juejin.im/post/7017719454775656461