【问题标题】:Consumer service not dequeuing all messages from ActiveMQ queue消费者服务未将所有消息从 ActiveMQ 队列中出列
【发布时间】:2014-08-08 00:38:45
【问题描述】:

我有一个 Windows 服务正在尝试使用来自一些 activemq 队列的消息。但是,它只收到一些消息,而其他消息则卡在队列中的“待处理消息”中。 ActiveMQ 告诉我它已经入队让我们说 500 条消息给消费者,但只有 300 条出队。服务中设置了多个侦听器。这是代码的重要部分:

private void setupListener(string queue, string brokerUri)
{
    try
    {
        ISession session = connectionConsumers[brokerUri].CreateSession();
        session.CreateConsumer(session.GetQueue(queue))
               .Listener += new MessageListener(consumer_Listener);
    }
    catch (Exception ex)
    {
        Log.Error("An exception has occured setting up listener for " + queue + " on " + brokerUri + ": {0}, {1}", ex, ex.Message);
    }
}

void consumer_Listener(IMessage message)
{
    try
    {
        processLog((message as ITextMessage).Text);
        message.Acknowledge();
    }
    catch (NMSException ex)
    {
        Log.Error("ActiveMQ Connection Failure: {0}, {1}", ex, ex.Message);
    }
    catch (Exception ex)
    {
        Log.Error("An exception has occured trying to process a message: {0}, {1}", ex, ex.Message);
    }
}

我确认消息的方式是否有问题会导致某些消息不被确认?是并发问题吗?我不确定他们是否仍在使用 processLog 功能(添加到我的数据库中)。

编辑:我认为这与确认未正确发生(出于某种原因)有关。我没有在我的日志中抛出异常。但是,activemq 显示如下:

根据我的阅读,调度队列中充满了发送给消费者但未确认的消息。为什么会这样?

【问题讨论】:

  • 您的消费者的预取大小是多少?消费者是否集中在一起?
  • 预取大小将是默认值,因此为 1000。消费者不会被池化。
  • 如果将预取设置为 0(轮询),问题会消失吗?只要不集中消费者应该不是问题,但这是我现在唯一能想到的。
  • 我尝试通过将连接 uri 更改为 'tcp://server:61616?consumer.prefetchSize=0' 来更改它,没有任何改变。但是在我的 ActiveMQ 管理器中,它指出预取仍然设置为 1000,所以也许我设置错了。
  • 尝试tcp://server:61616?jms.prefetchPolicy.all=0 为所有消费者全局禁用预取。详情请见here

标签: c# service activemq nms apache-nms


【解决方案1】:

问题与我们的队列是虚拟目的地有关。

【讨论】:

  • 我知道已经有很多年没有“回答”这个问题了,但如果接受的答案包含有关实际问题和解决方案的更多信息,那就更好了。
猜你喜欢
  • 1970-01-01
  • 2014-04-08
  • 2021-11-14
  • 2014-06-27
  • 2015-09-23
  • 1970-01-01
  • 2021-11-25
  • 2015-02-02
  • 1970-01-01
相关资源
最近更新 更多