Java 通知实现org.springframework.amqp.rabbit.connection.ConnectionListener的类关闭通道
我们使用Spring AMQP提供的ConnectionListener接口在底层连接上保留一个选项卡。频道通过自动恢复创建,心跳设置为10分钟(对于某些产品需要)。我的观察结果是,即使在底层rabbitMQ死后,connectionListener.onClose()方法也不会被调用近10分钟Java 通知实现org.springframework.amqp.rabbit.connection.ConnectionListener的类关闭通道,java,spring,spring-amqp,Java,Spring,Spring Amqp,我们使用Spring AMQP提供的ConnectionListener接口在底层连接上保留一个选项卡。频道通过自动恢复创建,心跳设置为10分钟(对于某些产品需要)。我的观察结果是,即使在底层rabbitMQ死后,connectionListener.onClose()方法也不会被调用近10分钟 我们还对API执行运行状况检查,并使用connectionListener.isOpen()方法确定连接的状态 由于SimpleConnection类中的这个代码块 @Override public b
@Override
public boolean isOpen() {
return delegate != null
&& (delegate.isOpen() || this.delegate.getClass().getSimpleName().contains("AutorecoveringConnection"));
}
- 由于isOpen方法显然不能满足需要,是否有任何建议的方法通知ConnectionListener通道关闭
- 实现Shutdowliner是一条路吗?由于我们无法访问ConnectionListener中的通道,因此无法直接执行connection.AddConnectionListener(此)。从connectionFactory ShutdownPleted方法,是否可以调用connectionListener上的onClose或任何其他方法来通知其关闭
还有其他想法吗?首先,
自动恢复
对于Spring AMQP是不必要的;它总是有自己的恢复机制,比客户端库现在提供的机制早(很长一段时间)
无论如何,它在用户端实际上是禁用的
原因是,当代理恢复通道时,在该通道上侦听的代码早就消失了,而消费者是孤立的。为了避免此问题,我们在检测到异常时关闭通道,以防止自动恢复通道
因此,简单的答案是在底层连接中禁用自动恢复
使用SimpleMessageListenerContainer
时,它将根据其recoveryInterval
或recoveryBackOff
继续无限期地尝试重新连接
你仍然可以使用心跳
此外,当使用者遇到异常时,容器发布应用程序事件;您可以使用ApplicationListener
接收这些事件的通知;有关更多信息,请参阅。- 正如所建议的那样,移除本机客户端的自动恢复机制为我们带来了好处
- 现在,如果连接重置,Spring AMQP自动恢复将启动
- ConnectionListener的isOpen()方法每次都返回正确的连接状态,因此health status API也是固定的