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();
}
}
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();
}
この時点では、RabbitMQ .NETクライアントに組み込まれた非同期/待機サポートはありません。 RabbitMQ .NETクライアントリポジトリにこのためのオープンチケットがあります
現在のasync
/TPL
サポートを要約するには:
AsyncEventingBasicConsumer
を返すTask
ができました。AsyncDefaultBasicConsumer
もあり、HandleBasicDeliver
などの仮想メソッドをオーバーライドしてTask
を返すことができます。元のPR ここ (5.0でも導入されたように見えますか?)async
操作をより完全にサポートする新しいゼロからの.NETクライアントに取り組んでいるようですが、私はその取り組みへの特定のリンクは表示されません。