【发布时间】:2013-08-01 02:09:45
【问题描述】:
我们有一个用例,其中我们只创建一个消费者来处理队列中的消息。消息处理器在确认之前累积一定数量的消息。以异步方式接收消息并使用事务处理会话。消息的大小非常小。
活动 MQ 在一定数量的消息后停止向唯一消费者发送更多消息并等待确认。我们尝试了 consumer.prefetchSize、consumer.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 可能正在记录到控制台的任何消息。