消费者没有收到来自 ActiveMQ 的消息
Posted
技术标签:
【中文标题】消费者没有收到来自 ActiveMQ 的消息【英文标题】:Consumer is not receiving messages from ActiveMQ 【发布时间】: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 配置吗? 我面临着完全相同的问题。你有解决方案吗? 有什么更新吗?我有类似的问题 在回复中添加解决方案。请在下方查看。 【参考方案1】:造成这种情况的一个原因可能是错误地将CachingConnectionFactory
(带有缓存的消费者)与动态调整消费者(最大消费者>消费者)的侦听器容器一起使用。您最终可能会得到一个缓存的消费者,它只是坐在池中而没有被积极使用。您永远不需要使用侦听器容器缓存消费者。
对于此类问题,我一般建议使用 TRACE 日志记录运行,您可以看到所有消费者活动。
【讨论】:
【参考方案2】:花了很多时间找出解决方案。 org.apache.activemq.ActiveMQConnection.java 类似乎存在一些问题,以防 AMQ 故障转移。在这种情况下,连接对象不会在消费者端启动。
以下是我在 ActiveMQConnection.java 文件中添加的修复程序并编译了源以创建 activemq-core-x.x.x.jar
private final Object startMutex = new Object();
在 createSession 方法中添加了一个检查
public Session createSession(boolean transacted, int acknowledgeMode) throws JMSException
synchronized (startMutex)
if(!isStarted())
start();
【讨论】:
以上是关于消费者没有收到来自 ActiveMQ 的消息的主要内容,如果未能解决你的问题,请参考以下文章
Springboot整合activeMQ之Topic,不懂也得懂了吧