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

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

还有其他想法吗?

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

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

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

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

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

你仍然可以使用心跳。

此外,容器在消费者遇到exception时发布应用程序事件; 您可以使用ApplicationListener来通知这些事件; 有关更多信息,请参阅文档 。

  • 正如所建议的,删除本机客户端的自动恢复机制对我们来说是个窍门。
  • 现在Spring AMQP自动恢复在连接重置的情况下启动。
  • 并且ConnectionListener的isOpen()方法每次都返回正确的连接状态,因此健康状态API也是固定的。