12

RabbitMQに接続していて、EventingBasicConsumerを使用してイベントをリッスンしている場合、サーバーから切断されているかどうかを確認するにはどうすればよいですか?

シャットダウンイベントがあることは知っていますが、障害をシミュレートするためにネットワークケーブルを抜いても起動しません。

モデルでModelShutdownイベントとCallbackExceptionも試しましたが、どれも機能していないようです。

編集-----私が答えとしてマークしたものは正しいですが、それは私にとっての解決策の一部にすぎませんでした。RabbitMQに組み込まれているHeartBeat機能もあります。サーバーは構成ファイルでそれを指定します。デフォルトは10分ですが、もちろん変更できます。

クライアントは、ConnectionFactoryインスタンスでRequestedHeartbeat値を設定することにより、ハートビートに異なる間隔を要求することもできます。

4

2 に答える 2

9

C# ライブラリを使用していると思いますか? (それでも、他の人にも同様のイベントがあると思います)。

次のことができます。

public class MyRabbitConsumer
{
  private IConnection connection;

  public void Connect()
  {
    connection = CreateAndOpenConnection();
    connection.ConnectionShutdown += connection_ConnectionShutdown;
  }

  public IConnection CreateAndOpenConnection() { ... }

  private void connection_ConnectionShutdown(IConnection connection, ShutdownEventArgs reason)
  {

  }
}
于 2013-02-27T12:05:36.493 に答える
2

これはその一例ですが、マークされた答えが私をこれに導いたものです。

var factory = new ConnectionFactory
{
    HostName = "MY_HOST_NAME",
    UserName = "USERNAME",
    Password = "PASSWORD",
    RequestedHeartbeat = 30
};

using (var connection = factory.CreateConnection())
{
    connection.ConnectionShutdown += (o, e) =>
    {                       
        //handle disconnect                            
    };

    using (var model = connection.CreateModel())
    {
        model.ExchangeDeclare(EXCHANGE_NAME, "topic");
        var queueName = model.QueueDeclare();

        model.QueueBind(queueName, EXCHANGE_NAME, "#"); 

        var consumer = new QueueingBasicConsumer(model);
        model.BasicConsume(queueName, true, consumer);

        while (!stop)
        {
            BasicDeliverEventArgs args;                       
            consumer.Queue.Dequeue(5000, out args);

            if (stop) return;

            if (args == null) continue;
            if (args.Body.Length == 0) continue;

            Task.Factory.StartNew(() =>
            {
                //Do work here on different thread then this one
            }, TaskCreationOptions.PreferFairness);
        }
    }
}

これについて注意すべき点がいくつかあります。

トピックに # を使用しています。これですべてが掴めます。通常、トピックで制限します。

プロセスをいつ終了するかを決定するために、「stop」という変数を設定しています。その変数が true になるまで、ループが無限に実行されることに気付くでしょう。

Dequeue は 5 秒間待機し、新しいメッセージがない場合はデータを取得せずに終了します。これは、停止変数をリッスンし、実際にある時点で終了することを保証するためです。値はお好みで変更してください。

メッセージが届くと、新しいスレッドで処理コードを生成します。現在のスレッドは、rabbitmq メッセージをリッスンするためだけに予約されています。ハンドラーの処理に時間がかかりすぎる場合、他のメッセージの速度が低下することは望ましくありません。実装によっては、これが必要な場合と必要でない場合があります。ただし、メッセージを処理するコードの作成には注意してください。実行に 1 分かかり、1 秒未満の時間でメッセージを取得すると、メモリが不足するか、少なくとも深刻なパフォーマンスの問題が発生します。

于 2015-01-18T17:39:30.463 に答える