Java 通知实现org.springframework.amqp.rabbit.connection.ConnectionListener的类关闭通道

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

我们使用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不会获知连接故障

    • 由于isOpen方法显然不能满足需要,是否有任何建议的方法通知ConnectionListener通道关闭

    • 实现Shutdowliner是一条路吗?由于我们无法访问ConnectionListener中的通道,因此无法直接执行connection.AddConnectionListener(此)。从connectionFactory ShutdownPleted方法,是否可以调用connectionListener上的onClose或任何其他方法来通知其关闭


    还有其他想法吗?

    首先,
    自动恢复
    对于Spring AMQP是不必要的;它总是有自己的恢复机制,比客户端库现在提供的机制早(很长一段时间)

    无论如何,它在用户端实际上是禁用的

    原因是,当代理恢复通道时,在该通道上侦听的代码早就消失了,而消费者是孤立的。为了避免此问题,我们在检测到异常时关闭通道,以防止自动恢复通道

    因此,简单的答案是在底层连接中禁用自动恢复

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

    你仍然可以使用心跳

    此外,当使用者遇到异常时,容器发布应用程序事件;您可以使用
    ApplicationListener
    接收这些事件的通知;有关更多信息,请参阅。

    • 正如所建议的那样,移除本机客户端的自动恢复机制为我们带来了好处
    • 现在,如果连接重置,Spring AMQP自动恢复将启动
    • ConnectionListener的isOpen()方法每次都返回正确的连接状态,因此health status API也是固定的