当前位置: 首页 > 知识库问答 >
问题:

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

罗允晨
2023-03-14

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

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

到目前为止,在整个开发、测试和生产环境中,所有工作都很好。

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

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

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

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

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

假设我真的有两个问题:

  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

共有2个答案

唐钊
2023-03-14

您只需要更改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虚拟机

  • 鲁旭
    2023-03-14

    您是否尝试过以下操作:

    >

  • 禁用InactivityMonitor<代码>线格式。maxInactivityDuration=0。

    URL:< code > TCP://localhost:61616?wire format . maxinactivityduration = 0

    如果您不想禁用,是否尝试将其设置为一个较高的数字,例如:URL:< code > TCP://localhost:61616?wire format . maxinactivityduration = 5000000(只是一个例子-使用您自己的时间,单位为毫秒)

    此外,确保jar文件对于客户端和服务器都是相同的版本。

    希望有帮助

  •  类似资料:
    • 我在玩QUARKUS,我试图创建摄取服务,它将数据发送到kafka或另一个RESTendpoint。我已经向项目添加了“夸克斯-小黑麦-反应性-消息传递-Kafka”和“夸克斯-反应性-消息传递-超文本传输协议”依赖项。我想只有一个特定的管道,即超文本传输协议- 现在的问题是,即使我有Kafka连接器注释在我的application.propertues,Kafka的健康检查仍然运行,并显示Kaf

    • 那么我应该做些什么来实现这个目标呢?如有任何帮助/线索,请提前感谢

    • 问题内容: 从MDN for NodeList: 在某些情况下,NodeList是一个实时集合,这意味着DOM中的更改会反映在集合中。例如,Node.childNodes处于活动状态: 在其他情况下,NodeList是静态集合,这意味着DOM中的任何后续更改都不会影响集合的内容。document.querySelectorAll返回一个静态NodeList。 所以....有点烦!是否有任何关于哪些

    • 应用程序有一个JMS队列负责交付审计日志。应用程序将日志发送到JMS队列,该队列由MDB使用。 但是,发送的消息是大 XML 文件,大小从 20 MB 到 100 MB 不等。问题在于 JMS 队列使用消息的时间太长,从而导致内存不足错误。 我应该怎么做才能解决这个问题?

    • 我正在寻找实现这一点的一般设计: 我想注册到ActivityRecognition API,以便在此API不时调用的IntentService中接收定期更新,而我的应用程序中的所有其他内容都是完全非活动的(这里的目标是避免耗尽设备上过多的电池电量)。 问题是,通过新的ActivityRecognition API设计,它与GooglePlayServices客户端绑定,例如: 从逻辑上讲,如果创建

    • 问题内容: 是否有可能使MySQL中的行处于非活动状态?因此,该行不再用于查询结果吗?我的客户希望保留删除的成员在数据库中的存在,但是我不想编辑所有查询以检查该成员是否被删除。 还是有一种简单的方法将整个行数据移动到另一个“非活动”表中? 问题答案: 您可以重命名当前表,在其中创建“ deleted”列,然后创建一个与当前表同名的视图,并选择“ deleted = 0”。这样,您不必更改所有查询。