java - 使用 RabbitMQ(Java 客户端),有没有办法确定在使用期间网络连接是否关闭?

标签 java rabbitmq amqp

我正在使用 Java 客户端在 RHEL 5.3 上使用 RabbitMQ。我有 2 个节点(机器)。 Node1 使用 Java 帮助程序类 QueueingConsumer 从 Node2 上的队列中消费消息。

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

如果接口(interface)在 Node1 或 Node2 上关闭(例如 ifconfig eth1 down),客户端(上面)永远不会知道网络不再存在。 RabbitMQ 是否在 Java 客户端上提供了某种类型的配置,可用于确定连接是否已经消失。关闭 Node2 上的 RabbitMQ 服务器将触发 ShutdownSignalException,它可以被捕获并且应用程序可以进入重新连接循环。但是关闭接口(interface)不会导致任何类型的异常发生,因此代码将永远等待 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(即使接口(interface)已关闭)。我假设在连接上注册 ShutdownListener 会产生相同的结果,但还没有尝试过。

有没有办法配置某种心跳,或者您是否只需要编写自定义租用逻辑(例如“我现在在这里”)才能让它工作?

最佳答案

一般来说,您最好在 rabbitmq-discuss 邮件列表上发布有关 rabbitmq 的问题。我们不倾向于跟踪在此之外提出的问题。

您可以配置心跳,但默认情况下它是关闭的。您也可以打开 TCP Keep Alive。在创建新连接之前调用 ConnectionFactory 上的 setRequestedHeartbeat,或者子类 ConnectionFactory,覆盖 configureSocket 方法,并调用 socket.setKeepAlive(true)。两者都应导致连接在网络中断时发出通知。

关于java - 使用 RabbitMQ(Java 客户端),有没有办法确定在使用期间网络连接是否关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2472278/

相关文章:

android - 适用于 android 和 iphone 的 RabbitMQ 或 ActiveMQ

c# - RabbitMQ 到 Azure IoT-Hub?

python - 任务调度服务

java - 如何使用spring boot在rabbit mq中创建动态队列?

java - 我可以从另一个网络应用程序控制一个网络应用程序吗?

java - 我可以在另一个网络元素中获取一个网络元素吗?

java - Newbee Drools 链表过滤

java - 为什么第 3 行没有发生动态绑定(bind)?

node.js - 如何停止rabbitmq服务器

python - celery worker 没有消耗足够的任务