13

Java クライアントを使用して RHEL 5.3 で RabbitMQ を使用しています。2 つのノード (マシン) があります。Node1 は、Java ヘルパー クラス QueueingConsumer を使用して、Node2 のキューからメッセージを消費しています。

QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume("MyQueueOnNode2", noAck, consumer);
while (true)
{
   QueueingConsumer.Delivery delivery = consumer.nextDelivery();
   ... Process message - delivery.getBody()
}

ノード 1 またはノード 2 でインターフェイスがダウンした場合 (例: ifconfig eth1 down)、クライアント (上記) はネットワークが存在しないことを認識しません。RabbitMQ は、接続が切断されたかどうかを判断するために使用できる、Java クライアントで何らかのタイプの構成を提供しますか。Node2 で RabbitMQ サーバーをシャットダウンすると、ShutdownSignalException がトリガーされます。これはキャッチされる可能性があり、アプリは再接続ループに入る可能性があります。ただし、インターフェイスを停止しても、どのような種類の例外も発生しないため、コードは consumer.nextDelivery() を永遠に待機します。

また、この呼び出しのタイムアウト バージョンを使用してみました。例えば

QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume("MyQueueOnNode2", noAck, consumer);
int timeout_ms = 30000;
while (true)
{
   QueueingConsumer.Delivery delivery = consumer.nextDelivery(timeout_ms);
   if (delivery == null)
   {
      if (channel.isOpen() == false)             // Seems to always return true
      { throw new ShutdownSignalException(); }
   }
   else
   {
     ... Process message - delivery.getBody()
   }
}

ただし、これは常に true を返すようです (インターフェイスがダウンしていても)。接続で ShutdownListener に登録しても同じ結果が得られると思いますが、まだ試していません。

ある種のハートビートを構成する方法はありますか、それともカスタム リース ロジック (「私は今ここにいます」など) を記述して、これを機能させる必要がありますか?

4

2 に答える 2

4

一般に、rabbitmq に関する質問は、rabbitmq-discuss メーリング リストに投稿したほうがよいでしょう。これ以外で尋ねられた質問を追跡する傾向はありません。

デフォルトではオフになっていますが、設定できるハートビートがあります。TCP Keep Alive をオンにすることもできます。setRequestedHeartbeat新しい接続を作成する前に を呼び出すConnectionFactoryか、サブクラス化ConnectionFactoryしてメソッドをオーバーライドしconfigureSocket、 を呼び出しますsocket.setKeepAlive(true)。どちらも、ネットワークが停止したときに接続が通知されるはずです。

于 2010-03-19T10:50:00.287 に答える
3

isOpenメソッドに関しては、ドキュメントで詳しく説明されています:http ://www.rabbitmq.com/api-guide.html#shutdown-atomicity

シャットダウンについて:node1または2をシャットダウンすると、RabbitMQサーバー自体ではなく、アプリケーションの権利を意味しますか?別のアプリケーションがメッセージブローカーから切断された場合、どのアプリケーションで知りたいのですか?それはメッセージングのポイントではありません。

実行できる唯一のことは、「必須」パラメーターを使用してメッセージを送信することです。これは、送信したメッセージに対して少なくとも1つのリスナーが必要であることをRabbitMQサーバーに通知します(直接キューであるか、トピック/ファンアウト交換のキューであるかは関係ありません)。その後、メッセージをどのキューにも配信できない場合、メッセージはチャネルに戻り、指定されたReturnListenerに転送されます。

于 2010-04-03T21:57:50.233 に答える