.Net Core RabbitMq.Client channel.BasicQos 不起作用



我正在使用RabbitMq.Client 5.1进行.net核心项目。我正在尝试仅处理来自一个消费者的消息十乘十,而不是一个接一个。我阅读了一些文档,我认为我的解决方案是正确设置预取计数。(不增加消费者数量(

我尝试了下面的代码,但仍然消息阻塞线程并正在逐个处理。

我也厌倦了EventBasicConsumer,但无法实现我的目标。

using (var connection = factory.CreateConnection())
using (channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "test", true, false, false, null);
channel.BasicQos(0, 10, false);
var consumer = new AsyncEventingBasicConsumer(channel);

consumer.Received += async (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x]Upload Received {0}", message);
await Task.Delay(1000);
};

channel.BasicConsume(queue: "test",
autoAck: true,
consumer: consumer);

Console.ReadLine();
}

Received事件一次只向代码传递一条消息 - 如何使用单个model事件处理程序参数传递更多消息?如果您随后处于睡眠状态,则只会延迟再次引发Received,因为您已经阻止了引发事件的线程。因此,您应该在其他线程或任务中处理消息。

即使Received一次只发出一条消息,RabbitMQ 也会向您的消费者发送 10 条消息。它们一直位于 TCP 缓冲区和 .NET 库内存缓冲区中,直到引发Received事件为止。

您可以通过延长睡眠时间并检查管理界面来证明这一点。您将看到该队列中有 10 条未确认的消息。


注意:RabbitMQ 团队监控rabbitmq-users邮件列表,并且只偶尔回答 StackOverflow 上的问题。

最新更新