我们使用Spring-AMQP提供的ConnectionListener接口在基础连接上保留一个选项卡。通道是通过自动恢复创建的,心跳设置为10分钟(对于某些产品需求)。我的观察是,即使底层rabbitMQ死亡之后,connectionListener.onClose()方法也几乎没有被调用10分钟。
我们还对API进行运行状况检查,并使用connectionListener.isOpen()方法确定连接状态。
并且由于SimpleConnection类中的此代码块

@Override
public boolean isOpen() {
    return delegate != null
            && (delegate.isOpen() || this.delegate.getClass().getSimpleName().contains("AutorecoveringConnection"));
}



由于连接正在自动恢复,因此始终返回true。因此,在断开连接后的10分钟内,Health API不会得知连接失败。


是否存在任何建议的方法来通知ConnectionListener通道关闭,因为isOpen方法显然不能满足需要?
正在实现ShutDownlistener吗?由于我们无权访问connectionListerner中的通道,因此无法直接执行connection.addConnectionListerner(此)。是否可以从connectionFactory shutdownCompleted方法调用connectionListener上的onClose或任何其他方法来通知其关闭?


还有其他想法吗?

最佳答案

首先,Spring AMQP不需要autoRecovery。它一直有自己的恢复机制,该机制早于(很长一段时间)客户端库现在提供的机制。

无论如何,它在消费者方面实际上是禁用的。

原因是,当代理恢复通道时,在该通道上侦听的代码已久不见,并且消费者被孤立了。为避免此问题,我们在检测到异常时关闭通道,以防止自动恢复来恢复通道。

因此,简单的答案是禁用基础连接中的自动恢复。

使用SimpleMessageListenerContainer时,它将根据其recoveryIntervalrecoveryBackOff无限期地继续尝试重新连接。

您仍然可以使用心跳。

另外,当使用者遇到异常时,容器会发布应用程序事件。您可以使用ApplicationListener通知这些事件;有关更多信息,请参见the documentation

10-07 16:14