我们使用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。因为Health API在连接中断后10分钟内没有得知连接失败。
是否有任何建议的方法来通知ConnectionListener通道关闭,因为isOpen方法显然无法满足需求?
实现ShutDownlistener的方法是什么?由于我们无法访问connectionListerner中的通道而无法直接执行connection.addConnectionListerner(this)。从connectionFactory shutdownCompleted方法是否可以调用onClose或connectionListener上的任何其他方法来通知它关闭?
还有其他想法吗?
答案 0 :(得分:1)
首先,Spring AMQP不需要autoRecovery
;它一直有自己的恢复机制,它早于(很长一段时间)客户端库现在提供的机制。
无论如何,它在消费者方面被有效禁用。
原因是当代理恢复通道时,正在该通道上侦听的代码早已消失,消费者将成为孤儿。为避免此问题,我们会在检测到异常时关闭通道,以防止自动恢复恢复通道。
因此,简单的答案是在底层连接中禁用自动恢复。
使用SimpleMessageListenerContainer
时,它会根据其recoveryInterval
或recoveryBackOff
无限期地继续尝试重新连接。
您仍然可以使用心跳。
此外,当消费者遇到异常时,容器会发布应用程序事件;您可以使用ApplicationListener
通知这些事件;有关详细信息,请参阅the documentation。
答案 1 :(得分:0)