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

2024-02-18

我在 RHEL 5.3 上使用 Java 客户端使用 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()
}

如果 Node1 或 Node2 上的接口被关闭(例如 ifconfig eth1 down),客户端(上图)永远不会知道网络不再存在。 RabbitMQ 是否在 Java 客户端上提供某种类型的配置,可用于确定连接是否已消失。关闭 Node2 上的 RabbitMQ 服务器将触发 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 会产生相同的结果,但尚未尝试过。

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


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用RabbitMQ(Java客户端),有没有办法确定消费期间网络连接是否关闭? 的相关文章

随机推荐