Используя RabbitMQ (клиент Java), там способ определить, закрывается ли сетевое соединение во время, используют?

Я использую 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 вниз), клиент (выше) никогда не знает, что сеть не там больше. Делает 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 на соединении приведет к тем же результатам, но еще не попробовала это.

Существует ли способ настроить своего рода heartbeat, или необходимо ли просто записать пользовательскую логику арендного договора (например, "Я здесь теперь"), чтобы заставить это работать?

13
задан Roger Lipscombe 13 July 2014 в 09:59
поделиться

2 ответа

В общем, вам лучше задавать вопросы по rabbitmq в списке рассылки rabbitmq-discuss. Мы не склонны отслеживать вопросы, задаваемые вне этого списка.

Есть сердцебиение, которое вы можете настроить, хотя по умолчанию оно выключено. Вы также можете включить TCP Keep Alive. Либо вызовите setRequestedHeartbeat на ConnectionFactory перед созданием нового соединения, либо подкласс ConnectionFactory, переопределите метод configureSocket и вызовите socket.setKeepAlive(true). Оба варианта должны привести к тому, что соединение не будет обнаружено, когда сеть умрет.

4
ответ дан 2 December 2019 в 01:49
поделиться

Что касается метода isOpen, который хорошо описан в документации: http://www.rabbitmq.com/api-guide.html#shutdown-atomicity

Относительно выключения: с выключением node1 или 2 вы имеете в виду именно приложение, а не сам RabbitMQ сервер? Почему вы хотите знать в каком-либо приложении, если другое приложение отключается от брокера сообщений? Не в этом смысл обмена сообщениями.

Единственное, что вы можете сделать, это отправлять сообщения с «обязательным» параметром. Это говорит серверу RabbitMQ, что вы ожидаете как минимум 1 слушателя для отправленного вами сообщения (будь то прямая очередь или некоторая очередь в обмене темами / разветвлениями). Если сообщение не может быть доставлено ни в какую очередь, оно вернется на ваш канал и переадресовано указанному ReturnListener.

3
ответ дан 2 December 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: