消费者没有收到来自 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 的消息的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMQ重试机制

Springboot整合activeMQ之Topic,不懂也得懂了吧

ActiveMQ 消费/转发来自另一个 ActiveMQ 实例的消息

为啥我的消息消费者没有收到所有其他消息?

骆驼拦截/元帅jms回复

ActiveMQ 消息未在第二个消费者中接收