我们使用 Spring-AMQP 提供的 ConnectionListener 接口(interface)来监视底层连接。该 channel 是通过自动恢复创建的,心跳设置为 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 channel 关闭,因为 isOpen 方法显然无法满足需求?
实现 ShutDownlistener 是正确的方法吗?由于我们无权访问connectionListerner中的 channel ,无法直接执行connection.addConnectionListerner(this)。从connectionFactory shutdownCompleted方法是否可以调用connectionListener上的onClose或任何其他方法来通知它关闭?
还有其他想法吗?
最佳答案
首先,Spring AMQP 不需要 autoRecovery
;它始终有自己的恢复机制,该机制早于(很长一段时间)客户端库现在提供的机制。
无论如何,它在消费者端实际上被禁用了。
原因是,当代理恢复 channel 时,监听该 channel 的代码早已消失,消费者也成为孤立的。为了避免这个问题,我们在检测到异常时关闭 channel ,以防止自动恢复恢复 channel 。
因此,简单的答案是禁用底层连接中的自动恢复。
使用 SimpleMessageListenerContainer
时,它将根据其 recoveryInterval
或 recoveryBackOff
继续无限期地尝试重新连接。
您仍然可以使用心跳。
此外,当消费者遇到异常时,容器会发布应用程序事件;您可以使用 ApplicationListener
来接收这些事件的通知;请参阅the documentation了解更多信息。
关于java - 向实现 org.springframework.amqp.rabbit.connection.ConnectionListener 的类通知 channel 关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33511868/