ActiveMQ:“通道长时间处于非活动状态”异常会停止代理消息传递

时间:2013-05-01 14:29:05

标签: java jms activemq

我的系统包含以下部分:

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

到目前为止,所有在开发,测试和生产环境中都能正常工作。

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

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

相信ActiveMQ有一些内部保持活动状态,即使在非活动时间超过默认值30秒也应保持连接。

基础设施人员监控了该客户端的VPN并确认它始终保持连接状态。

不要相信它是错误的代码或Spring配置,因为我们在不同的客户端中有许多其他侦听器实例,并且它们都表现得很好。

假设我确实有两个问题:

  1. 是什么导致“频道不活跃”例外?
  2. 为什么单个客户端中的此异常会阻止ActiveMQ工作?
  3. 编辑 - 添加异常堆栈跟踪:

    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
    

2 个答案:

答案 0 :(得分:4)

您是否尝试过以下操作:

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

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

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

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

  4. 希望有所帮助

答案 1 :(得分:-2)

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

  1. transportConnectors部分:
  2. transportConnector name =" ws" URI =" WS://0.0.0.0:61614"     更改 transportConnector name =" ws" URI =" TCP://0.0.0.0:61614"

    适用于我的Windows和Linux虚拟机