ActiveMQ的:异常“太久通道不活动的”停止经纪人短信(ActiveMQ:'channe

2019-09-01 15:10发布

我的系统有以下几个部分:

  • ActiveMQ代理暴露在TCP端口61616
  • 3个Grails的/春战争是活在自己的Tomcat服务器,他们发布和接收消息的JMS代理
  • n次远程客户机系统与JMS侦听器组件来接收客户特定的消息,通过VPN使用主机名和端口61616连接到JMS代理

到目前为止,所有的工作在整个开发,测试和生产环境优良。

我们刚刚在连接生产新的客户端系统,我们已经注意到,它的日志开始报告“频道是不活动的时间太长”异常和断开连接。 这令人担忧一个客户端的整体效果是,它停止所有信息消费的经纪人这样带来的是整个系统停了下来。

此客户端监听器(使用Spring缓存连接工厂)出现连接到JMS代理确定,过程中的一些信息,然后3分钟异常报告。 在ActiveMQ中打开DEBUG,并得到输出的负载,没有任何提示就大约在同一时间经纪人警告或错误,但。

相信ActiveMQ的有一些内部保持活跃应该保持连接,即使处于非活动状态比默认的30秒。

基础设施家伙已经监控此客户端的VPN并确认熬夜和连接的全部时间。

不要认为这是代码或Spring配置是有过错的,因为我们有不同的客户端听众的许多其他情况下,他们都循规蹈矩的罚款。

假设我有2个问题真:

  1. 是什么原因造成“通道无效”异常?
  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

Answer 1:

你有没有试过如下:

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

    网址:TCP://本地主机:61616 wireFormat.maxInactivityDuration = 0

  2. 如果你不希望禁用,你试图将它设置得高一些如:网址: tcp://localhost:61616?wireFormat.maxInactivityDuration=5000000 (just an example - use your own time in ms)

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

希望能帮助到你



Answer 2:

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

  1. transportConnectors部分:

transportConnector名= “WS” URI = “WS://0.0.0.0:61614” 更改transportConnector名= “WS” URI = “TCP://0.0.0.0:61614”

它适用于我的Windows和Linux虚拟机



文章来源: ActiveMQ:'channel inactive for too long' exceptions stop broker messaging