Асинхронная поддержка 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
операции, но я не вижу никаких конкретных ссылок на эти усилия.