我正在为一个.net核心项目使用RabbitMq.Client 5.1。我正试图处理来自一个消费者的消息,而不是一个接一个。我读了一些文档,我认为我的解决方案是正确设置预取计数。(不增加消费者数量)
我尝试了下面的代码,但消息仍然阻塞线程,并被一个接一个地处理。
我也累了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();
}
1条答案
按热度按时间93ze6v8z1#
Received
事件一次只向代码传递一条消息-它如何使用一个model
事件处理程序参数传递更多消息?如果您随后休眠,则只会在Received
再次引发时延迟,因为您已经阻塞了引发事件的线程。因此,您应该在其他线程或任务中处理您的消息。即使
Received
每次只引发一条消息,RabbitMQ也会向消费者发送10条消息。它们位于TCP缓冲区和.NET库内存缓冲区中,直到引发Received
事件。你可以通过睡得更久和查看管理界面来证明这一点。您将看到该队列中有10条未确认的消息。