我正在使用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 上的问题。