【发布时间】: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