Gibt es eine Möglichkeit, mit RabbitMQ (Java-Client) festzustellen, ob die Netzwerkverbindung während des Verbrauchs geschlossen wird?

Ich verwende RabbitMQ auf RHEL 5.3 mit dem Java-Client. Ich habe 2 Knoten (Maschinen). Knoten1 verbraucht Nachrichten aus einer Warteschlange auf Knoten2 mithilfe der Java-Hilfsklasse QueueingConsumer.

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

Wenn die Schnittstelle auf Node1 oder Node2 heruntergefahren wird (z. B. ifconfig eth1 down), weiß der Client (oben) nie, dass das Netzwerk nicht mehr vorhanden ist. Bietet RabbitMQ eine Art von Konfiguration auf dem Java-Client, mit der festgestellt werden kann, ob die Verbindung unterbrochen wurde? Das Herunterfahren des RabbitMQ-Servers auf Node2 löst eine ShutdownSignalException aus, die abgefangen werden kann und die App in eine Wiederverbindungsschleife geraten kann. Das Herunterfahren der Schnittstelle führt jedoch nicht zu einer Ausnahme, sodass der Code für immer auf consumer.nextDelivery () wartet.

Ich habe auch versucht, die Timeout-Version dieses Aufrufs zu verwenden. z.B.

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()
   }
}

Es scheint jedoch, dass dies immer true zurückgibt (obwohl die Schnittstelle nicht verfügbar ist). Ich gehe davon aus, dass die Registrierung für den ShutdownListener auf der Verbindung zu denselben Ergebnissen führt, habe dies jedoch noch nicht versucht.

Gibt es eine Möglichkeit, einen Heartbeat zu konfigurieren, oder müssen Sie nur eine benutzerdefinierte Lease-Logik schreiben (z. B. "Ich bin jetzt hier"), damit dies funktioniert?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage