10
while (true)
{
    BasicDeliverEventArgs e = (BasicDeliverEventArgs)Consumer.Queue.Dequeue();
    IBasicProperties properties = e.BasicProperties;
    byte[] body = e.Body;
    Console.WriteLine("Recieved Message : " + Encoding.UTF8.GetString(body));
    ch.BasicAck(e.DeliveryTag, false);
}

これは、サブスクリプションによってメッセージを取得するときに行うことです。Consumer に継続的にリッスンしてもらいたいので、While ループを使用します。これを偶数ベースにしたい場合はどうすればよいでしょうか。それは、その時点で新しいメッセージがキューに到着したときです。消費者のみがメッセージを消費する必要があります..またはそのような同様のイベントで..

4

3 に答える 3

9

RabbitMQ.Client.Events.EventingBasicConsumerブロックするコンシューマではなく、イベント コンシューマに を使用します。

于 2010-12-14T20:59:05.427 に答える
7

現在、Consumer.Queue.Dequeue() でブロックしています。あなたの質問を正しく理解できれば、メッセージを非同期的に消費したいと思うでしょう。

これを行う標準的な方法は、(おそらくDefaultBasicConsumerをサブクラス化することによって)独自のIBasicConsumerを作成し、それをチャネルのコンシューマーとして設定することです。

これに関する問題は、IBasicConsumer.HandleBasicDelivery で何をするかについて非常に注意しなければならないことです。basic.publish などの同期 AMQP メソッドを使用すると、デッドロックが発生します。時間がかかることをすると、別の問題が発生します。

同期メソッドまたは実行時間の長いアクションが必要な場合は、それを行うための正しい方法について行っています。サブスクリプションを見てください。メッセージを消費してキューに入れるのは IBasicConsumer です。

さらに支援が必要な場合は、rabbitmq-discuss メーリング リストで質問するのが最適です。

于 2010-08-10T10:02:04.500 に答える
4

私はこの問題を抱えていて、答えが見つからなかったので、メッセージが受信されたときにRabbitMQサブスクリプションが.Netイベントを発生させるデモプロジェクトを作成しました。サブスクリプションは独自のスレッドで実行され、UI (私の場合) は自由に実行できます。

強力なRabbitMQからのメッセージをリッスンするので、私のプロジェクトをRabbitEarと呼ぶのは面白いです.これをRabbitMQサイトと共有するつもりです.

http://rabbitears.codeplex.com/で確認してください。

ありがとうサイモン

于 2010-11-22T13:15:14.897 に答える