前言
为什么记录这个,主要是第一次使用Quartz开发定时任务,而且是集群式部署,生产环境两个实例,开发环境单实例但是有很多环境(这里要注意一下很多环境,坑人呐~),害我排查了好久,才找到问题根源!!
现象描述
该项目之前就是用的Quartz开发的定时任务,线程池线程数配置的为3,
集群式部署:
我按照之前的开发方式新增加了一个任务类,并可以正常写入到表内,但是!!!有一个测试环境就可以完美运行,有一个环境跑起来要不不执行且该触发器状态变成ERROR,要么跑几次之后就变成ERROR,而且我查看的服务还没有错误日志,甚是郁闷!
排查问题过程
1.我先去看官方文档,也是说了改状态表示触发器异常有问题,没有得到更多有用的支持;
2.我在网上搜了一下类似问题,有提到版本问题,要保持一致;
于是乎我将有问题环境当中知道的实例都停了,然后将qrtz_scheduler_state表(主要记录调度器状态)中唯一的一条记录删除(如果有多条,也是很明显有多个实例连接该数据库),过一个捡入周期刷新,发现又有一条记录写入!!!!说明有某个实例连接该数据库,于是可以执行一下sql查看连接数据库信息:
SELECT DISTINCT * FROM `information_schema`.`PROCESSLIST` P WHERE P.USER NOT IN('root','repl','system user')
你可以发现当前连接该数据库的主机地址等信息,
随后根据主机地址找到了该隐藏很深的实例,把实例停掉,再起新代码实例,完美运行!
总结
就是说如果多个实例共用一个库存储任务、触发器信息,那么就要保证各个实例上的代码版本一致,否则代码落后的实例获取到新触发器列表却没有任务类,那么就是将触发器状态置为ERROR。