使用Hystrix断路器暂停/恢复JMS侦听器

时间:2018-12-03 02:14:24

标签: spring spring-integration spring-jms hystrix circuit-breaker

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

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

有没有办法处理断路器命令事件,例如:断开/半断开/闭合?然后,我可以在发生电路断开事件时将代码编写为停止 JMS,并在发生电路半断开事件时启动 JMS。

或者在依赖项失败时临时暂停JMS侦听器的最佳实践是什么?

注意:我们将Spring Integration message-driven-channel-adapter用于侦听器。

2 个答案:

答案 0 :(得分:2)

JMS侦听器是一个Lifecycle bean,因此是Spring Integration中的JMS入站通道适配器。这意味着它们具有start()/stop()方法,从而使您可以停止使用消息而无需停止应用程序上下文。

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

如果您只运行带有Spring Integration(SI)的单个应用程序上下文来进行断路器,那么您可能希望受益于here所述的内部SI支持。

答案 1 :(得分:0)

对于那些有相同问题的人,在检查了Hystrix Circuit Breaker库的代码之后,我意识到首先没有任何机制可以通知Circuit状态更改。其次,即使事件在那里,也无法解决我的问题。因为,在睡眠窗口(电路断开时)之后的第一次尝试(服务呼叫)已达到半开状态。同时,对于我来说,当JMS Listener停止时,将不会进行任何下一次尝试/调用。

最终,我开发了一个自定义的断路器库,该断路器库在打开电路时启动计时器/调度程序,并在触发计时器(睡眠窗口)时自动将电路移至半开状态。