我正在使用 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()
}
如果接口在 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 会产生相同的结果,但还没有尝试过。
有没有办法配置某种心跳,或者你只需要编写自定义租约逻辑(例如“我现在在这里”)才能让它工作?