Я использую RabbitMQ на RHEL 5.3 с помощью клиента Java. У меня 2 узла (машины). Node1 использует сообщения из очереди на Node2, используя вспомогательный класс Java QueueingConsumer.
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume("MyQueueOnNode2", noAck, consumer);
while (true)
{
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
... Process message - delivery.getBody()
}
Если интерфейс отключен на Node1 или Node2 (например, ifconfig eth1 down), клиент (см. Выше) никогда не узнает, что сети больше нет. Предоставляет ли RabbitMQ какой-либо тип конфигурации на клиенте Java, который можно использовать для определения, разорвалось ли соединение. Завершение работы сервера RabbitMQ на Node2 вызовет исключение 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 в соединении даст те же результаты, но еще не пробовал.
Есть ли способ настроить какое-то сердцебиение, или вам просто нужно написать собственную логику аренды (например, «Я здесь сейчас»), чтобы заставить это работать?