gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:49:09 26 4
gpt4 key购买 nike

  • 我们使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com