Spring quartz 集群模式下trigger_state error问题原因
来源:互联网 发布:淘宝上卖符咒 编辑:程序博客网 时间:2024/05/20 20:46
问题描述
在项目中采用了Spring quartz调度任务来执行定时任务,quartz本身是支持集群化方式的,可以配置一个数据源,quartz会在数据库中创建一系列的表,使用这些表来存储调度的信息,集群中所有的节点都访问这一个数据库,这样可以实现集群环境下的定时任务调度。
但是在最近生产环境出现了这样的问题,新增的一个定时调度任务,当服务启动后,执行两次以后,该任务就不再执行了,但是其他原有的定时任务并没有出现问题,只有这个新增的任务无法执行,检查qrtz_triggers表,发现该条调度任务的记录的trigger_state变成了”error”状态。
问题分析
1、检查是否新增的定时任务抛出异常,导致了任务中断,加入大量的日志以及异常捕获,未发现任何异常的日志,排除了代码报错的可能
2、猜测是否是因为数据库中调度相关表存在脏数据,导致了新增的调度任务不执行;随后将相关表全部清空,重启集群中所有节点,观察,发现仍然是执行两次后变为”error”
3、检查qrtz_scheduler_state表,发现存在多条记录,根据网上查找的信息,将多条记录删除,只保留一条,再重启集群,观察,发现仍然不行
4、由第三条可知,qrtz_scheduler_state表中有多条记录,仔细观察instance_name的记录,发现是由服务器节点的实例名加数字组成,将instance的地址与集群中每个节点进行对比,发现问题原因,有两个instance的id并不在生成环境的集群节点中,但是与集群公用一个数据库,那两个节点的代码版本,发现与当前线上版本不一致,没有新增的定时调度任务,由此导致了该问题的发生
问题总结
当使用quartz集群模式时,当集群中的代码版本不一致,会出现qrtz_triggers中trigger_state的状态变为”error”的情况,原因是集群模式先quartz执行调度任务,是根据数据库表中的调度记录进行执行,当执行到有对应代码的节点上,不会出现问题,但是当执行到没有对应代码的节点上,就会变为”error”,
因此在集群环境下,节点较多的时候使用quartz,需要注意每个节点的代码版本一定要保持一致
- Spring quartz 集群模式下trigger_state error问题原因
- spring+quartz集群下复杂应用
- quartz集成spring下的集群配置
- Spring+Quartz的集群配置问题
- 关于spring + quartz 定时启动集群问题
- Spring+Quartz tomcat集群
- Spring+quartz集群配置
- Spring+Quartz tomcat集群
- spring+quartz集群1
- Spring+Quartz 集群2
- spring quartz 集群配置
- spring+Quartz集群
- spring quartz 集群 注意
- spring quartz集群
- spring+mybatis+quartz集群
- [java]spring-Quartz集群
- spring quartz集群配置
- 另类中的另类 Spring quartz在集群环境下解决方案
- 异常:redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
- Oracle的rollup、cube、grouping sets函数
- HDU-3717:Rescue(二分枚举+模拟)
- void glVertexPointer(int size,int type,int stride,Buffer pointer)
- hdu6103(尺取法)
- Spring quartz 集群模式下trigger_state error问题原因
- Deep Learning笔记(一) Windows | Linux配置Caffe环境
- CentOS系统启动流程(二)
- JPA Override 源码中createdDate,createdBy,lastModifiedBy,lastModifiedDate(过于麻烦,见下一篇已更新方法)
- Collection集合框架整理
- 谍报分析
- 用作者提供的net1->net2生成MTCNN的训练样本(positive,negative,part,landmark)
- 常见排序算法
- xpath基础知识定位