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

Posted

技术标签:

【中文标题】ActiveMQ:\'channel inactive for too long\' 异常停止代理消息传递【英文标题】:ActiveMQ:'channel inactive for too long' exceptions stop broker messagingActiveMQ:'channel inactive for too long' 异常停止代理消息传递 【发布时间】:2013-04-25 13:28:40 【问题描述】:

我的系统有以下几部分:

在 tcp 端口 61616 上暴露的 ActiveMQ 代理 3 个 Grails/Spring 战争,它们存在于自己的 Tomcat 服务器中,它们向 JMS 代理发布和使用消息 n 次远程客户端系统使用 JMS 侦听器组件接收客户端特定消息,使用主机名和端口 61616 通过 *** 连接到 JMS 代理

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

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

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

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

基础设施人员已监控此客户端的 ***,并确认它始终保持连接状态。

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

假设我真的有 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

【问题讨论】:

您在 ActiveMQ 邮件列表上会获得更好的运气。开发人员需要代理日志等进行调查,也没有提及代理版本。 @shuttsy - 想知道你是否尝试过,结果是一样的。祝你好运! 找到这个:activemq.apache.org/activemq-inactivitymonitor.html 您能否修复此错误?我有类似的,有时甚至超过 30 秒不活动。连接仍然存在。 【参考方案1】:

你只需要更改activemq.xml(配置文件):

    transportConnectors 部分:

    transportConnector name="ws" uri="ws://0.0.0.0:61614"
    

    改变

    transportConnector name="ws" uri="tcp://0.0.0.0:61614"
    

它适用于我的 windows 和 linux 虚拟机

【讨论】:

【参考方案2】:

您是否尝试过以下方法:

    禁用 InactivityMonitor; wireFormat.maxInactivityDuration=0 例如

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

    如果您不想禁用,是否尝试将其设置为较大的数字,例如:URL:tcp://localhost:61616?wireFormat.maxInactivityDuration=5000000 (just an example - use your own time in ms)

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

希望对你有帮助

【讨论】:

以上是关于ActiveMQ:'channel inactive for too long' 异常停止代理消息传递的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMQ Channel was inactive for too long: localhost/127.0.0.1:8161

rabbitmq的channel的connection的区别

Spring-integration / ActiveMQ 在单个线程中订阅多个目的地

rabbitmq订阅topic卡住的问题

kvm虚似机监控

activemq 怎么 启动一个监听