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 に登録しても同じ結果が得られると思いますが、まだ試していません。
ある種のハートビートを構成する方法はありますか、それともカスタム リース ロジック (「私は今ここにいます」など) を記述して、これを機能させる必要がありますか?