【问题标题】:Consumer is not receiving messages from ActiveMQ消费者没有收到来自 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 配置吗?
  • 我面临着完全相同的问题。你有解决方案吗?
  • 有什么更新吗?我有类似的问题
  • 在回复中添加解决方案。请在下方查看。

标签: activemq spring-jms


【解决方案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();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2018-08-22
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 2020-11-15
      相关资源
      最近更新 更多