gpt4 book ai didi

java - ActiveMQ :'channel inactive for too long' 异常停止代理消息传递

转载 作者:搜寻专家 更新时间:2023-11-01 03:25:01 25 4
gpt4 key购买 nike

我的系统有以下部分:

  • ActiveMQ 代理在 tcp 上公开,端口 61616
  • 3 个 Grails/Spring war 在他们自己的 Tomcat 服务器中,他们向 JMS 代理发布和使用消息
  • n 次带有 JMS 监听器组件的远程客户端系统接收客户端特定消息,使用主机名和端口 61616 通过 VPN 连接到 JMS 代理

到目前为止,在开发、测试和生产环境中一切正常。

我们刚刚在生产环境中连接了一个新的客户端系统,我们注意到它的日志开始报告“ channel 处于非 Activity 状态的时间太长”异常并断开连接。担心这个客户端的整体影响是它停止了代理上的所有消息消费,从而导致整个系统停止。

此客户端监听器(使用 Spring 缓存连接工厂)似乎可以连接到 JMS 代理,处理一些消息,然后 3 分钟报告异常。在 ActiveMQ 中打开 DEBUG 并获得大量输出,但几乎同时没有任何迹象表明代理上有警告或错误。

相信 ActiveMQ 有一些内部保持 Activity ,即使不活动的时间超过默认的 30 秒,也应该保持连接。

基础架构人员已监控此客户端的 VPN,并确认它一直保持连接状态。

不要相信是代码或 Spring 配置出了问题,因为我们在不同的客户端中有许多其他的监听器实例,它们都表现良好。

假设我真的有 2 个问题:

  1. 是什么导致“ channel 不活动”异常?
  2. 为什么单个客户端中的这个异常会阻止 ActiveMQ 工作?

编辑 - 添加异常堆栈跟踪:

2013-04-24 14:02:06,359 WARN  - Encountered a JMSException - resetting the underlying JMS Connection (org.springframework.jms.connection.CachingConnectionFactory)
javax.jms.JMSException: Channel was inactive for too (>30000) long: jmsserver/xxx.xx.xx.xxx:61616
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49)
at org.apache.activemq.ActiveMQConnection.onAsyncException(ActiveMQConnection.java:1833)
at org.apache.activemq.ActiveMQConnection.onException(ActiveMQConnection.java:1850)
at org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:101)
at org.apache.activemq.transport.ResponseCorrelator.onException(ResponseCorrelator.java:126)
at org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:101)
at org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:101)
at org.apache.activemq.transport.WireFormatNegotiator.onException(WireFormatNegotiator.java:160)
at org.apache.activemq.transport.InactivityMonitor.onException(InactivityMonitor.java:266)
at org.apache.activemq.transport.InactivityMonitor$4.run(InactivityMonitor.java:186)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:693)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:719)
at java.lang.Thread.run(Thread.java:813)
Caused by: org.apache.activemq.transport.InactivityIOException: Channel was inactive for too (>30000) long: jmsserver/xxx.xx.xx.xxx:61616
... 4 more

最佳答案

您是否尝试过以下方法:

  1. 禁用 InactivityMonitor; wireFormat.maxInactivityDuration=0 例如

    网址:tcp://localhost:61616?wireFormat.maxInactivityDuration=0

  2. 如果您不想禁用,您是否尝试过将其设置为较高的数字,例如:URL:tcp://localhost:61616?wireFormat.maxInactivityDuration=5000000(仅举个例子 - 使用你自己的时间(以毫秒为单位)

  3. 此外,确保客户端和服务器的 jar 文件版本相同。

希望对你有帮助

关于java - ActiveMQ :'channel inactive for too long' 异常停止代理消息传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com