Ich verwende RabbitMQ unter RHEL 5.3 mit dem Java-Client. Ich habe 2 Knoten (Maschinen). Node1 verwendet Nachrichten aus einer Warteschlange auf Node2 mit der Java-Hilfsklasse QueueingConsumer.Kann mit RabbitMQ (Java-Client) festgestellt werden, ob die Netzwerkverbindung während des Verbrauchs geschlossen ist?
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume("MyQueueOnNode2", noAck, consumer);
while (true)
{
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
... Process message - delivery.getBody()
}
Wenn die Schnittstelle nach unten auf Node1 oder Knoten 2 (zum Beispiel ifconfig eth1 nach unten) gebracht wird, der Client (oben) nie das Netz kennt, ist nicht mehr da. Bietet RabbitMQ eine Art von Konfiguration auf dem Java-Client, die verwendet werden kann, um festzustellen, ob die Verbindung verschwunden ist. Das Herunterfahren des RabbitMQ-Servers auf Node2 löst eine ShutdownSignalException aus, die abgefangen werden kann und die App in eine Reconnect-Schleife wechseln kann. Aber das Herunterfahren der Schnittstelle verursacht keine Art von Ausnahme, so dass der Code für immer auf consumer.nextDelivery() warten wird.
Ich habe auch versucht, die Timeout-Version dieses Anrufs 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()
}
}
aber scheint, dass dies immer wahr zurückgibt (obwohl die Schnittstelle inaktiv ist). Ich nehme an, die Registrierung für den ShutdownListener auf der Verbindung wird die gleichen Ergebnisse liefern, aber noch nicht ausprobiert.
Gibt es eine Möglichkeit, eine Art von Heartbeat zu konfigurieren, oder müssen Sie nur benutzerdefinierte Lease-Logik schreiben (z. B. "Ich bin jetzt hier"), um dies zum Laufen zu bringen?