Асинхронная поддержка 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();
    }
}

3 ответов


Rabbit поддерживает отправку асинхронных обработчиков сообщений с помощью AsyncEventingBasicConsumer класса. Он работает аналогично EventingBasicConsumer, но позволяет зарегистрировать обратный вызов, который возвращает 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();
}

на данный момент нет поддержки async/await, встроенной в клиент RabbitMQ .NET. Для этого есть открытый билет на клиентский репозиторий RabbitMQ .NET


обобщить ток async/TPL поддержка:

  • как упоминал @paul-turner, теперь есть AsyncEventingBasicConsumer для которого вы можете зарегистрировать события и вернуть Task.
  • есть AsyncDefaultBasicConsumer за что вы можете переопределить виртуальные методы, такие как HandleBasicDeliver и вернуться в Task. Оригинальный PR здесь (похоже, он также был представлен в 5.0?)
  • в окончательных комментариях к вышеуказанному PR и этот выпуск, похоже, они работают над новым, с нуля .NET-клиентом, который будет более полно поддерживать async операции, но я не вижу никаких конкретных ссылок на эти усилия.