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)
此时,RabbitMQ .NET客户端内置了async/await支持.RabbitMQ .NET客户端存储库上有一个打开的票证
总结当前async/TPL支持:
AsyncEventingBasicConsumer您可以为其注册事件并返回Task.AsyncDefaultBasicConsumer您可以重写虚拟方法,例如HandleBasicDeliver并返回Task. 原来的PR在这里(貌似5.0也引入了?)async操作,但我没有看到任何具体的链接。