Я использую 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, которое можно поймать, и приложение может перейти в цикл повторного подключения. Но сведение интерфейса не приводит к возникновению какого-либо типа исключения, поэтому код будет ждать навсегда .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 в соединении даст те же результаты, но пока не пробовала.
Есть ли способ настроить какое-то свое сердцебиение, или просто нужно написать индивидуальную логику аренды (например, "Я здесь сейчас" ), чтобы заставить это работать?