Java ActiveMQ:';通道不活动时间过长';异常停止代理消息传递

Java ActiveMQ:';通道不活动时间过长';异常停止代理消息传递,java,jms,activemq,Java,Jms,Activemq,我的系统包括以下部分: ActiveMQ代理在tcp端口61616上公开 3个Grails/SpringWars,它们生活在自己的Tomcat服务器中,它们向JMS代理发布和使用消息 n次使用JMS侦听器组件的远程客户端系统来接收特定于客户端的消息,使用主机名和端口61616通过VPN连接到JMS代理 到目前为止,所有这些都可以在整个开发、测试和生产环境中正常工作 我们刚刚在生产中连接了一个新的客户机系统,我们注意到它的日志开始报告“通道长时间处于非活动状态”异常并断开连接。 令人担忧的是,

我的系统包括以下部分:

  • ActiveMQ代理在tcp端口61616上公开
  • 3个Grails/SpringWars,它们生活在自己的Tomcat服务器中,它们向JMS代理发布和使用消息
  • n次使用JMS侦听器组件的远程客户端系统来接收特定于客户端的消息,使用主机名和端口61616通过VPN连接到JMS代理
到目前为止,所有这些都可以在整个开发、测试和生产环境中正常工作

我们刚刚在生产中连接了一个新的客户机系统,我们注意到它的日志开始报告“通道长时间处于非活动状态”异常并断开连接。 令人担忧的是,这一客户端的总体效果是它停止了代理上的所有消息消费,从而使整个系统停止

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

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

基础设施人员已经监控了该客户端的VPN,并确认它一直保持正常运行和连接

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

假设我有两个问题:

  • 是什么导致“通道不活动”异常
  • 为什么单个客户端中的此异常会阻止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
    

    您是否尝试过以下方法:

  • 禁用不活动监视器<代码>wireFormat.maxInactivityDuration=0例如

    URL:
    tcp://localhost:61616?wireFormat.maxInactivityDuration=0

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

  • 另外,确保客户机和服务器的jar文件版本相同


  • 希望它有帮助

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

  • 运输连接器组:

    transportConnector name="ws" uri="ws://0.0.0.0:61614"
    
  • 改变

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

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

    如果您在ActiveMQ邮件列表中看到它,您会更幸运。开发者需要代理日志等来进行调查,也没有提到代理版本。@shuttsy-不知道您是否尝试过,结果是否相同。祝你好运发现此错误:您是否能够修复此错误?我有一个类似的,有时甚至它是不活跃的超过30秒。连接仍处于活动状态。