通知频道关闭 类 实施 org.springframework.amqp.rabbit.connection.ConnectionListener
Notifying channel shutdown to classes implementing the org.springframework.amqp.rabbit.connection.ConnectionListener
我们使用 Spring-AMQP 提供的 ConnectionListener 接口来保持底层连接的标签。该通道是使用自动恢复创建的,心跳设置为 10 分钟(用于某些产品需求)。我的观察是 connectionListener.onClose() 方法不会被调用近 10 分钟,即使在底层的 rabbitMQ 已经死了。
我们也对API进行健康状态检查,使用connectionListener.isOpen()方法判断连接状态
并且因为 SimpleConnection 中的这个代码块 class
@Override
public boolean isOpen() {
return delegate != null
&& (delegate.isOpen() || this.delegate.getClass().getSimpleName().contains("AutorecoveringConnection"));
}
总是 returns 真,因为连接正在自动恢复。因此,Health API 在连接终止后 10 分钟内不会获悉连接失败。
由于 isOpen 方法显然不能满足需要,是否有任何推荐的方法通知 ConnectionListener 通道关闭?
是否可以实施 ShutDownlistener?由于我们无权访问 connectionListerner 中的通道,因此无法直接执行 connection.addConnectionListerner (this)。从 connectionFactory shutdownCompleted 方法是否可以调用 onClose 或 connectionListener 上的任何其他方法来通知它关闭?
还有其他想法吗?
首先,Spring AMQP 不需要 autoRecovery
;它一直有自己的恢复机制,早于(很长一段时间)现在由客户端库提供的机制。
无论如何它在消费者端被有效禁用。
原因是当代理恢复通道时,在该通道上侦听的代码早已不复存在,并且消费者是孤立的。为了避免这个问题,我们在检测到异常时关闭通道,以防止自动恢复恢复通道。
所以,简单的答案是在底层连接中禁用自动恢复。
当使用 SimpleMessageListenerContainer
时,它将根据其 recoveryInterval
或 recoveryBackOff
.
无限期地继续尝试重新连接
您仍然可以使用检测信号。
此外,容器在消费者遇到异常时发布应用事件;您可以使用 ApplicationListener
来通知这些事件;有关详细信息,请参阅 the documentation。
- 按照建议,删除本机客户端的自动恢复机制对我们有用。
- 现在 Spring AMQP 自动恢复会在连接重置时启动。
- 并且 ConnectionListener 的 isOpen() 方法 returns 每次都是正确的连接状态,因此健康状态 API 也是固定的。
我们使用 Spring-AMQP 提供的 ConnectionListener 接口来保持底层连接的标签。该通道是使用自动恢复创建的,心跳设置为 10 分钟(用于某些产品需求)。我的观察是 connectionListener.onClose() 方法不会被调用近 10 分钟,即使在底层的 rabbitMQ 已经死了。
我们也对API进行健康状态检查,使用connectionListener.isOpen()方法判断连接状态
并且因为 SimpleConnection 中的这个代码块 class
@Override public boolean isOpen() { return delegate != null && (delegate.isOpen() || this.delegate.getClass().getSimpleName().contains("AutorecoveringConnection")); }
总是 returns 真,因为连接正在自动恢复。因此,Health API 在连接终止后 10 分钟内不会获悉连接失败。
由于 isOpen 方法显然不能满足需要,是否有任何推荐的方法通知 ConnectionListener 通道关闭?
是否可以实施 ShutDownlistener?由于我们无权访问 connectionListerner 中的通道,因此无法直接执行 connection.addConnectionListerner (this)。从 connectionFactory shutdownCompleted 方法是否可以调用 onClose 或 connectionListener 上的任何其他方法来通知它关闭?
还有其他想法吗?
首先,Spring AMQP 不需要 autoRecovery
;它一直有自己的恢复机制,早于(很长一段时间)现在由客户端库提供的机制。
无论如何它在消费者端被有效禁用。
原因是当代理恢复通道时,在该通道上侦听的代码早已不复存在,并且消费者是孤立的。为了避免这个问题,我们在检测到异常时关闭通道,以防止自动恢复恢复通道。
所以,简单的答案是在底层连接中禁用自动恢复。
当使用 SimpleMessageListenerContainer
时,它将根据其 recoveryInterval
或 recoveryBackOff
.
您仍然可以使用检测信号。
此外,容器在消费者遇到异常时发布应用事件;您可以使用 ApplicationListener
来通知这些事件;有关详细信息,请参阅 the documentation。
- 按照建议,删除本机客户端的自动恢复机制对我们有用。
- 现在 Spring AMQP 自动恢复会在连接重置时启动。
- 并且 ConnectionListener 的 isOpen() 方法 returns 每次都是正确的连接状态,因此健康状态 API 也是固定的。