在没有DispatchConsumersAsync = true的情况下解释AsyncEventingBasicConsumer行为

Gig*_*igi 8 c# asynchronous rabbitmq

我正在AsyncEventingBasicConsumer使用以下代码尝试RabbitMQ :

static void Main(string[] args)
{
    Console.Title = "Consumer";

    var factory = new ConnectionFactory() { DispatchConsumersAsync = true };
    const string queueName = "myqueue";

    using (var connection = factory.CreateConnection())
    using (var channel = connection.CreateModel())
    {
        channel.QueueDeclare(queueName, true, false, false, null);

        // consumer

        var consumer = new AsyncEventingBasicConsumer(channel);
        consumer.Received += Consumer_Received;
        channel.BasicConsume(queueName, true, consumer);

        // publisher

        var props = channel.CreateBasicProperties();
        int i = 0;

        while (true)
        {
            var messageBody = Encoding.UTF8.GetBytes($"Message {++i}");
            channel.BasicPublish("", queueName, props, messageBody);
            Thread.Sleep(50);
        }
    }
}

private static async Task Consumer_Received(object sender, BasicDeliverEventArgs @event)
{
    var message = Encoding.UTF8.GetString(@event.Body);

    Console.WriteLine($"Begin processing {message}");

    await Task.Delay(250);

    Console.WriteLine($"End processing {message}");
}
Run Code Online (Sandbox Code Playgroud)

它按预期工作.DispatchConsumersAsync但是,如果我没有设置属性,则会消耗消息,但事件处理程序永远不会触发.

我发现很难相信这种危险的行为(因为开发人员忘记设置属性而丢失消息)是设计上的.

问题:

  1. 什么是DispatchConsumersAsync真正做到?
  2. 没有的情况下发生了什么事情DispatchConsumersAsync,消费正在发生,但事件处理程序不会触发?
  3. 这种行为是设计的吗?

is_*_*_oz 3

答案实际上就在你的问题中。是的,这与设计有关。该文档解释并给出了有关异步模式的小示例。

客户端提供面向异步的消费者调度实现。该调度程序只能与异步消费者(即IAsyncBasicConsumer实现)一起使用。
为了使用此调度程序,请将ConnectionFactory.DispatchConsumersAsync属性设置为true

因此文档没有足够的信息来回答您的第一个问题。然而,第二,如果你想使用AsyncEventingBasicConsumer,你必须将ConnectionFactory.DispatchConsumersAsync属性设置为true。这是RabbitMq的设计和规则。
第三个问题实际上你自己回答。是的,现在是关于 RabbitMq .net 客户端的设计。