java - 向实现 org.springframework.amqp.rabbit.connection.ConnectionListener 的类通知 channel 关闭

标签 java spring spring-amqp

  • 我们使用 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 时,它将根据其 recoveryIntervalrecoveryBackOff 继续无限期地尝试重新连接。

您仍然可以使用心跳。

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

关于java - 向实现 org.springframework.amqp.rabbit.connection.ConnectionListener 的类通知 channel 关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33511868/

相关文章:

java - Spring FeignClient : How to configure a load balancer like Ribbon

rabbitmq - Storm 使用 Spring AMQP 从 RabbitMq 读取消息

java - 问题处理 RabbitMq Listener 抛出的异常

java - JProfiler - [n 类] 是什么意思?

java - java swing 中的 HTML 渲染

java - 如果第一个为假,则一个 if 语句中的两个条件是否第二个重要?

具有批处理功能的 Java 8 Stream

java - Spring 网络流: Understanding generated JSP

java - 最新的spring-rabbit不支持encoder标签?

java - 如何在android中的viewpager上从右到左获取上一个 fragment