【发布时间】:2013-08-13 10:44:25
【问题描述】:
我们正面临一个关于 ActiveMQ 及其消费者的随机问题。我们观察到,很少有消费者没有收到消息,即使他们连接到 ActiveMQ 队列。但是在消费者重启后它工作正常。
我们在 ActiveMQ 端有一个名为 testQueue 的队列。消费者正在尝试从该队列中取出消息。为此,我们使用 Spring 的 DefaultMessageListenerContainer。消息正在从 ActiveMQ 代理传递到消费者节点。从 tcpdump 也可以看出,消息正在到达消费者节点,但实际的消费者代码无法看到消息。换句话说,消息似乎卡在 ActiveMQ 消费者代码或 Spring 的 DefaultMessageListenerContainer 中。
见下图。为了更清楚地说明这个问题。消息正在到达消费者节点,但没有到达“实际消费者类”,这意味着消息卡在 AMQ 消费者代码或 Spring DMLC 中。
以下是从 ActiveMQ 管理员捕获的详细信息。
队列名称 /Pending-Message-Count /Consumer-Count /Messages-Enqueued /Messages-Dequeued 测试队列 /9 /1 /9 /0
下面是更多细节。
Connection-ID /SessionId /Selector /Enqueues /Dequeues /Dispatched /Dispatched-Queue /Prefetch ID:bearsvir52-45176-1375519181268-3:5 /1 / /9 /0 /9 /9 /250
从第二个表可以明显看出,消息正在传递给消费者,但消费者没有确认消息。因此消息被卡在代理端的 Dispatched-Queue 中。
注意几点:
1)Broker节点和消费者节点没有时间差。
2) 观察消费者端的 tcpdump。我们可以看到 MessageDispatch(Openwire) 数据包正在传输到消费者节点,但找不到相同的 MessageAck(Openwire)。
3)有时它在一个节点上工作,有时它在同一个节点上产生问题。
【问题讨论】:
-
你能贴出显示 ConectionFactory、DMLC 和监听器类的 Spring 配置吗?
-
我面临着完全相同的问题。你有解决方案吗?
-
有什么更新吗?我有类似的问题
-
在回复中添加解决方案。请在下方查看。
标签: activemq spring-jms