`
三问飞絮
  • 浏览: 320596 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

ActiveMQ中断(RuntimeTestEvaluator.visit(ShadowMatchImpl.java:140))

    博客分类:
  • Java
 
阅读更多

场景描述

       临下班时,突然接到电话。说某个客户的生产环境上,MQ中断,不能再接收数据,导致整个业务流程中断。由于临下班本来就是一个业务操作的高峰期,造成大面积的客户,门店等待。

       通过了解情况,客户环境通过MQ进行消息中转,解决核心业务系统与我方系统的解藕。我方系统为四个tomcat的集群。

       查看MQ的console,消息量一直在持续增加,其他的消息目标仍有消费者。由此推出MQ服务器本身应该没有问题。

       根据前方的同事的反馈,重启业务系统,MQ上仍然没有消费者。同时反馈中,数据库上有死锁。日志上有标题上的空指针异常。详细如下:

 

java.lang.NullPointerException
	at org.aspectj.weaver.reflect.ShadowMatchImpl$RuntimeTestEvaluator.visit(ShadowMatchImpl.java:140)
	at org.aspectj.weaver.ast.Instanceof.accept(Instanceof.java:29)
	at org.aspectj.weaver.reflect.ShadowMatchImpl$RuntimeTestEvaluator.matches(ShadowMatchImpl.java:121)
	at org.aspectj.weaver.reflect.ShadowMatchImpl.matchesJoinPoint(ShadowMatchImpl.java:78)
	at org.springframework.aop.aspectj.AspectJExpressionPointcut.matches(AspectJExpressionPointcut.java:313)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:159)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
	at $Proxy24.save(Unknown Source)

 

 

        于是乎,怀疑解决死锁是因为有四台同时接收MQ消息。于是关掉三台业务系统的MQ接收,同时在去掉死锁后,重启业务系统,发布可以正常接收MQ消息了。虽然不能理解数据库的死锁跟MQ的中断有什么关系。同时,日志中的NullpointException又有什么关系?

         正当高兴问题已经解决时,前方又反馈MQ上对应的消费者又丢失了。

         于是按日志上的NullpointException去google了一下。这个明显是spring内部的问题,会跟数据有关系吗?

         打到以下bug记录(https://bugs.eclipse.org/bugs/show_bug.cgi?id=318899)。即在spring2.5对应的切面实现中,aspectj对函数第一个参数为空值的情况有bug。会抛出上面提到的异常。顺势查找接口代码,对于外部消息的主键查找本地记录时,没有判断是否存在,都进行save操作。添加判断后,此问题解决。

 

还原错误过程

        一、首先系统MQ接收接口编写不严谨。

                1、没有使用连接池(PooledConnectionFactory)。这样,接收过程由于网络或其他原因中断连接后,不能再重新连接MQ服务器,建立消费者关系。

                2、消息接收自动AUTO_ACK模式,于是接收过程有异常情况,不能正常处理消息的情况下。MQ服务器的消息已经被接收下来并自动给予了ACK回执。有可能造成消息丢失。

        

        二,业务接收代码编写不严谨,没有进行合理的判断。

        

         三,为什么在MQ上的消费者会消失?

               虽然在onMessage里,代码有进行try catch异常。但因为数据问题及程序没有合理判断,同时spring中AspectJ的bug。应该是由于NullException进而引发Error抛出,不能被拦截。所有连接失效。

 

         四,为什么重启,有时候有效有时候无效?

                因为前面提到的编写不严谨,消息一接收就从MQ上进行删除。所有一条错误数据的消息接收一次就消失了,刚好下一条消息是正常的,则重启成功了。如果下一条消息也是错误,不存在的数据,那么tomcat重启后,实际是有建立MQ的消费者的,只是一接收马上又挂了。等我们去console查看时,早已显示无MQ消费者接收了。

 

         五,假设第一条MQ编写严谨,而第二点依然没有进行业务判断,结果如何?

           原系统中,存在一定的将错就错。如果只修改第一条,而第二条不改的话,将造成无限死循环。因为错误结果的消息一直收不到ACK,就直存在于MQ服务器中。

分享到:
评论

相关推荐

    apache-activemq-5.17.3

    2. **conf**:配置文件目录,其中的`activemq.xml`是最核心的配置文件,定义了ActiveMQ服务器的行为,如连接器、代理策略、持久化机制等。 3. **data**:这是ActiveMQ运行时存储数据的目录,包括消息存储、临时文件...

    apache-activemq-5.16.6-bin.zip

    2. **配置**: 修改conf目录下的activemq.xml文件以定制你的消息代理设置。 3. **创建消息生产者和消费者**: 使用JMS API或者支持的其他协议创建应用程序,发送和接收消息。 4. **访问Web Console**: 浏览器中输入`...

    apache-activemq-5.16.5

    3. 根据你的操作系统,运行`bin`目录下的启动脚本,例如在Linux/Unix上是`bin/activemq start`,在Windows上是`bin\activemq.bat start`。 4. 打开浏览器访问`http://localhost:8161/admin`,使用默认凭据(通常为...

    apache-activemq-5.15.12-bin.tar.gz

    1.解压  ...ACTIVEMQ_HOME=/opt/apache-activemq-5.15.12 PATH=/opt/apache-activemq-5.15.12/bin:$PATH export ACTIVEMQ_HOME PATH 5.activemq的后台默认端口是61616,前台访问端口是8161

    apache-activemq-5.15.15二进制包,安装包

    Apache ActiveMQ是世界上最流行的开源消息代理和集成模式服务器,它基于Java Message Service (JMS) 规范。这个“apache-activemq-5.15.15二进制包,安装包”包含了运行和配置ActiveMQ所需的所有组件,方便用户在...

    java springboot整合activemq工程

    spring.activemq.broker-url=failover:(tcp://10.0.1.227:61616,tcp://10.0.1.228:61616,tcp://10.0.1.229:61616,mqtt://10.0.1.227:1883,mqtt://10.0.1.228:1883,mqtt://10.0.1.229:1883) #spring.activemq.broker-...

    ActiveMQ消息服务器 v5.17.6.zip

    2. **配置**:配置文件默认为conf/activemq.xml,可根据需求调整队列、主题、网络连接等设置。 3. **创建和消费消息**:使用JMS API或者ActiveMQ提供的客户端库,可以创建生产者发送消息,消费者接收消息。 4. **...

    apache-activemq-5.18.5-bin.zip

    apache-activemq-5.18.5-bin

    apache-activemq-5.15.11-bin.tar.gz

    - **启动与配置**:进入解压后的目录,通过`bin/activemq start`启动服务,并可以编辑`conf/activemq.xml`进行配置。 - **防火墙设置**:可能需要在Linux防火墙中开启ActiveMQ的默认端口(如61616)以允许外部连接...

    ActiveMQ的activemq.xml详细配置讲解

    **ActiveMQ的activemq.xml配置详解** ActiveMQ是Apache软件基金会开发的一个开源消息代理,它遵循Java消息服务(JMS)规范,提供可靠的消息传递功能。`activemq.xml`是ActiveMQ的核心配置文件,它定义了服务器的...

    ActiveMQ in action.pdf 英文版

    - **JMS介绍**:Java消息服务(JMS)是一种API,用于在不同的应用程序之间发送和接收消息,实现应用程序之间的解耦。 - **消息模型**:包括点对点(P2P)和发布/订阅(Pub/Sub)两种模型,分别对应于队列和主题。 ...

    apache-activemq-5.15.11-bin.rar

    配置文件主要位于conf目录下,如activemq.xml,可根据需求进行定制。 6. **使用与编程**: 开发者可以通过JMS API或ActiveMQ提供的客户端库来编写发送和接收消息的代码。例如,创建一个生产者发送消息到队列,再...

    apache-activemq-5.16.5-bin.tar.gz 下载(5积分)

    Apache ActiveMQ是Apache软件基金会的一个开源项目,是一个基于消息的通信中间件。ActiveMQ是JMS的一个具体实现,支持JMS的两种消息模型。ActiveMQ使用AMQP协议集成多平台应用,使用STOMP协议通过websockets在Web...

    activemq-5.15.15 JDBC持久化mysql8.0+的activemq.xml.pdf

    标题中的“activemq-5.15.15 JDBC持久化mysql8.0+的activemq.xml”指的是Apache ActiveMQ的一个特定版本(5.15.15)配置文件,该配置文件用于实现消息队列的数据持久化,通过JDBC连接MySQL 8.0以上的版本。...

    apache-activemq-5.12.0.zip

    Apache ActiveMQ是世界上最流行的开源消息代理和队列服务器,它基于Java Message Service (JMS) 规范。这个"apache-activemq-5.12.0.zip"压缩包包含的是ActiveMQ 5.12.0版本的源代码、二进制文件和其他相关资源。...

    activemq-all.5.14jar包

    activemq-all.5.14jar包,亲测可用!!

    activemq_basic.rar

    ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它遵循Java消息服务(JMS)标准,用于在分布式系统中提供高效、可靠的消息传递。在这个"activemq_basic.rar"压缩包中,我们可以预见到是一些关于ActiveMQ的...

    activeMQ收发工具.rar

    本压缩包“activeMQ收发工具.rar”包含了用于测试和操作ActiveMQ的实用工具,主要是一个jar包文件,方便用户在安装了Java Development Kit (JDK) 的环境中运行。 ActiveMQ收发工具的核心功能是通过Java应用程序发送...

    apache-activemq-5.18.1-bin.tar.gz

    1. **bin目录**:包含运行和管理ActiveMQ的可执行脚本,如启动和停止服务器的脚本(activemq.bat或activemq)以及管理工具(如mqadmin或broker)。 2. **conf目录**:配置文件存放处,其中最重要的是`activemq.xml`...

    linux-apache-activemq-5.15.3和 linux-jdk1.8

    4. 修改配置:根据需求编辑activemq.xml配置文件,调整如存储、网络连接、安全等设置。 5. 启动ActiveMQ:执行bin目录下的activemq start命令启动服务器。 6. 监控与管理:可以通过Web控制台(默认端口8161)来监控...

Global site tag (gtag.js) - Google Analytics