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

时间:2015-11-04 00:48:59

标签: java spring spring-amqp

  • 我们使用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上的任何其他方法来通知它关闭?

还有其他想法吗?

2 个答案:

答案 0 :(得分:1)

首先,Spring AMQP不需要autoRecovery;它一直有自己的恢复机制,它早于(很长一段时间)客户端库现在提供的机制。

无论如何,它在消费者方面被有效禁用。

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

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

使用SimpleMessageListenerContainer时,它会根据其recoveryIntervalrecoveryBackOff无限期地继续尝试重新连接。

您仍然可以使用心跳。

此外,当消费者遇到异常时,容器会发布应用程序事件;您可以使用ApplicationListener通知这些事件;有关详细信息,请参阅the documentation

答案 1 :(得分:0)

  • 根据建议,删除本机客户端的自动恢复机制为我们做了诀窍。
  • 现在Spring AMQP自动恢复在连接重置的情况下启动。
  • ConnectionListener的isOpen()方法每次都返回正确的连接状态,因此健康状态API也是固定的。