【问题标题】:ActiveMQ stops sending messages to Queue Consumer in case of consumer not acknowledging messages如果消费者不确认消息,ActiveMQ 会停止向队列消费者发送消息
【发布时间】:2013-08-01 02:09:45
【问题描述】:

我们有一个用例,其中我们只创建一个消费者来处理队列中的消息。消息处理器在确认之前累积一定数量的消息。以异步方式接收消息并使用事务处理会话。消息的大小非常小。

活动 MQ 在一定数量的消息后停止向唯一消费者发送更多消息并等待确认。我们尝试了 consumer.prefetchSizeconsumer.maximumPendingMessageLimit 等解决方案;但没有任何工作。 我们尝试了类似的用例,其中包含一个只有一个订阅者的持久主题,并且效果很好。

有没有人遇到过类似的 activemq 问题/行为?我们尝试了很多在不同论坛上提到的东西,但都没有帮助。

ActiveMQ 版本:ActiveMQ 5.6.0
队列配置:持久队列
消费者:异步并使用事务处理作为确认模式

任何帮助或建议将不胜感激。谢谢。

【问题讨论】:

  • 请显示打开QueueSession的代码。以及您在QueueSession 上调用commit 的代码。从第一次读取到commit 需要多长时间?
  • 我忘记了:会话是如何关闭的(正常情况下和异常情况下)
  • 我很难在这里传递整个代码,因为它太大/复杂,并且仅粘贴代码 sn-p 不会对理解我的问题产生任何影响。当我创建队列的消费者时,我打开会话并在收到停止请求时关闭会话。
  • 此外,提交会话所花费的时间不是固定的,它取决于收到的消息数量。当收到所需数量的消息时,我们在会话实例上调用 commit。只要我提交少量消息,这种方法就可以正常工作。但是一旦我开始积累更大的数字。没有确认的消息,activemq 在某个点之后停止发送进一步的消息并等待确认。需要进行哪些配置更改来克服这个问题?此外,当我用主题替换队列时,这种方法工作正常,它发送消息并且不等待.
  • 能否请您启动一个干净的 ActiveMQ 实例,即不接受任何消息的实例。设置消费者并开始向队列发布消息。继续发布,直到您的消费者停止接收消息。接下来,通过 JConsole 或 JVisualVM 进入 JMX,并在进程树中转到 org.apache.activemq//Queue/。请张贴 DequeueCount、DispatchCount、EnqueueCount 和 MemoryLimit 以及 MemoryPercentPortion 的值。能否请您附上 ActiveMQ 可能正在记录到控制台的任何消息。

标签: java jms activemq


【解决方案1】:

我尝试了很多不同的配置来通过设置不同的 activemq 属性(如预取策略、maxpagesize 等)来解决这个问题,但它们都没有真正的帮助。通过参考@Jake's 评论,我了解了使用 JMX 监控 activemq 通过 JConsole。这是一个非常方便的工具来监控和管理你的 activemq。 以下是一些您可能会觉得有用的文章。
1.Monitoring activemq
2.Connecting activemq JMX using JConsole

通过监控队列属性,我发现 memoryLimit 属性分配给它的值非常低(只有 1mb)。增加属性的值解决了我的问题。 JMS 无需等待确认即可开始发送消息。

出于测试目的,我在 conf/activemq.xml 配置文件中更改了 memoryLimit 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-23
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2014-10-23
    • 2015-11-25
    • 2021-11-25
    相关资源
    最近更新 更多