Pause/Resume 使用 Hystrix 断路器的 JMS 侦听器

Pause/Resume JMS Listener Using Hystrix Circuit Breaker

我们有一个 JMS 侦听器,它从 MQ 中提取消息并将它们保存在数据库中。我的问题是什么是在数据库关闭时临时暂停 JMS 侦听器并在一段时间后再次恢复它的最佳方法。

我的想法是在数据库操作周围使用 Spring 断路器来监视其运行状况并回退到错误处理程序方法。这将有助于避免每次都等待数据库超时。但是,侦听器仍在提取消息并尝试保存它们,这会浪费 CPU 和网络。

有什么方法可以处理断路器命令事件,例如:open/half-open/close?然后我可以在电路打开事件发生时将代码写入 stop JMS,在电路半打开事件发生时将代码写入 start JMS。

或者当依赖项失败时临时暂停 JMS 侦听器的最佳做法是什么?

注意:我们正在为侦听器使用 Spring 集成消息驱动通道适配器。

JMS 侦听器是一个 Lifecycle bean,也是 Spring 集成中的 JMS 入站通道适配器。这意味着它们有 start()/stop() 方法,因此允许您在不停止应用程序上下文的情况下停止使用消息。

关于断路器,我假设您谈论的是 spring 云服务之一。如果是这样,那么您只需将 JMS 侦听器或适配器注入它的实现并调用它的 start/stop 方法。但这主要是为了引入断路器分布式微服务,这也意味着服务发现和其他高级功能。

如果您只是 运行 具有 spring 集成 (SI) 的单个应用程序上下文来执行断路器,您可能希望从描述的内部 SI 支持中受益 here.

遇到同样问题的朋友,在查看Hystrix Circuit Breaker库的代码后,我意识到首先没有任何机制来通知Circuit state changes。其次,即使事件发生了,也解决不了我的问题。因为,半开状态是在睡眠 window(电路打开时)后的第一次尝试(服务调用)达到的。同时,对于我的情况,当 JMS Listener 停止时,不会有任何下一个 attempt/call.

最终,我开发了一个自定义断路器库,它在打开电路时启动 timer/scheduler,并在定时器(睡眠 window)触发时自动将电路移动到半开状态。