小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
项目场景:
项目里采用的定时任务是Quartz,配置的是集群持久化,多台节点连接同一个数据库。
问题描述:
新加的定时任务,跑了一两次就不执行了。一查询该任务的触发器状态变成ERROR,日志报Couldn’t retrieve job because a required class was not found;
原因分析:
因为是集群,有多个节点。报这个错误的意思是有节点执行定时任务时没有找到定时器的类,所以就把该定时任务的触发器的状态置为了ERROR。
可能的原因就是节点代码版本不一致。但是我反复确认了一下,代码版本都是一致的,后来我查询qrtz_job_details表一看,终于找到了问题所在,存在表里的job_class_name字段是代理类的路径。这就奇了怪了,为什么构建job信息获取bean的是代理类的路径。
一看是动态代理,应该是使用springAOP出现的问题。再一看项目里原来用AOP设置了切面进行异常日志的记录,拦截了所有的业务目录下的包。
解决方案:
在切面注解里排除掉定时任务的类,重启启动,在创建定时任务时获取到的就是路径正常了,定时任务也正常执行了。
虽然是解决了问题,但其中的原理还是不清楚,有知道的小伙伴吗?欢迎评论区留下宝贵的意见