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

问题描述 投票:2回答:2

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

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

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

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

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

spring spring-integration spring-jms hystrix circuit-breaker
2个回答
2
投票

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

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

如果您只使用弹簧集成(SI)运行单个应用程序上下文来执行断路器,您可能希望受益于here所描述的内部SI支持。


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.