.Net Core RabbitMq.客户端通道.BasicQos不工作

zrfyljdw  于 8个月前  发布在  RabbitMQ
关注(0)|答案(1)|浏览(112)

我正在为一个.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();
            }
93ze6v8z

93ze6v8z1#

Received事件一次只向代码传递一条消息-它如何使用一个model事件处理程序参数传递更多消息?如果您随后休眠,则只会在Received再次引发时延迟,因为您已经阻塞了引发事件的线程。因此,您应该在其他线程或任务中处理您的消息。
即使Received每次只引发一条消息,RabbitMQ也会向消费者发送10条消息。它们位于TCP缓冲区和.NET库内存缓冲区中,直到引发Received事件。
你可以通过睡得更久和查看管理界面来证明这一点。您将看到该队列中有10条未确认的消息。

相关问题