RabbitMQ异步支持

Gig*_*igi 15 c# asynchronous rabbitmq

RabbitMQ .NET客户端是否有任何异步支持?我希望能够异步连接和使用消息,但到目前为止还没有找到办法.

(对于消费消息,我可以使用EventingBasicConsumer,但这不是一个完整的解决方案.)

为了给出一些上下文,这是我现在如何使用RabbitMQ的一个例子(代码取自我的博客):

var factory = new ConnectionFactory() { HostName = "localhost" };

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

        var consumer = new EventingBasicConsumer(channel);
        consumer.Received += Consumer_Received;
        channel.BasicConsume("testqueue", true, consumer);

        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*ner 20

Rabbit支持使用AsyncEventingBasicConsumer该类调度异步消息处理程序.它的工作方式类似于EventingBasicConsumer,但允许您注册一个返回a的回调Task.调度回调Task并由RabbitMQ客户端等待返回.

var factory = new ConnectionFactory
{
    HostName = "localhost",
    DispatchConsumersAsync = true
};

using(var connection = cf.CreateConnection())
{
    using(var channel = conn.CreateModel())
    {
        channel.QueueDeclare("testqueue", true, false, false, null);

        var consumer = new AsyncEventingBasicConsumer(model);

        consumer.Received += async (o, a) =>
        {
            Console.WriteLine("Message Get" + a.DeliveryTag);
            await Task.Yield();
        };
    }

    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

  • 似乎从5.0.0-pre3开始就可以使用它. (2认同)

Der*_*ley 8

此时,RabbitMQ .NET客户端内置了async/await支持.RabbitMQ .NET客户端存储库上有一个打开的票证

  • 对于这样一个受欢迎的平台来说,这么多年了,这真的很荒谬...... (2认同)

Tob*_*s J 5

总结当前async/TPL支持:

  • 正如 @paul-turner 提到的,现在AsyncEventingBasicConsumer您可以为其注册事件并返回Task.
  • 还有一个AsyncDefaultBasicConsumer您可以重写虚拟方法,例如HandleBasicDeliver并返回Task. 原来的PR在这里(貌似5.0也引入了?)
  • 根据上述 PR 和此问题的最终评论,看起来他们正在开发一个新的、从头开始的 .NET 客户端,它将更全面地支持async操作,但我没有看到任何具体的链接。