web-dev-qa-db-ja.com

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();
    }
}
16
Gigi

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();
}
24
Paul Turner

この時点では、RabbitMQ .NETクライアントに組み込まれた非同期/待機サポートはありません。 RabbitMQ .NETクライアントリポジトリにこのためのオープンチケットがあります

8
Derick Bailey

現在のasync/TPLサポートを要約するには:

  • @ paul-turnerが述べたように、イベントを登録してAsyncEventingBasicConsumerを返すTaskができました。
  • AsyncDefaultBasicConsumer もあり、HandleBasicDeliverなどの仮想メソッドをオーバーライドしてTaskを返すことができます。元のPR ここ (5.0でも導入されたように見えますか?)
  • 上記のPRと この問題 の最後のコメントによれば、async操作をより完全にサポートする新しいゼロからの.NETクライアントに取り組んでいるようですが、私はその取り組みへの特定のリンクは表示されません。
3
Tobias J