Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 使用Hystrix断路器暂停/恢复JMS侦听器_Spring_Spring Integration_Spring Jms_Hystrix_Circuit Breaker - Fatal编程技术网

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

Spring 使用Hystrix断路器暂停/恢复JMS侦听器,spring,spring-integration,spring-jms,hystrix,circuit-breaker,Spring,Spring Integration,Spring Jms,Hystrix,Circuit Breaker,我们有一个JMS侦听器,它从MQ中提取消息并将它们保存在数据库中。我的问题是,在数据库关闭时暂停JMS侦听器并在一段时间后再次恢复它的最佳方法是什么 我的想法是在db操作周围使用弹簧断路器来监控其运行状况,并返回到错误处理程序方法。这将有助于避免每次等待db超时。但是,侦听器仍然在提取消息并尝试保存它们,这是在浪费CPU和网络 有没有办法处理断路器命令事件,如:打开/半打开/关闭?然后,我可以编写代码,当电路开路事件发生时,停止JMS,当电路半开路事件发生时,启动JMS 或者,当依赖项失败时,暂

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

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

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

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


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

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

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


如果您仅使用spring integration(SI)运行单个应用程序上下文来执行断路器,您可能希望从所述的内部SI支持中获益。

对于有相同问题的用户,请在检查Hystrix断路器库的代码后,我意识到,首先,没有任何机制来通知电路状态的变化。第二,即使发生了这些事件,也不能解决我的问题。因为,在睡眠窗口(电路开路时)之后的第一次尝试(服务呼叫)会达到半开路状态。然而,在我的情况下,当JMS侦听器停止时,将不会有任何下一次尝试/调用


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

谢谢你的回答。是的,JMS侦听器有停止/启动方法,但问题是如何将其与Hystrix断路器集成。我发现有一种方法可以得到Hystrix事件的通知,但是当它移动到“半开”状态时,没有一种事件类型:我不确定您为什么关心半开。当数据库连接不可用时,我将假设会出现一些故障(异常)。如果将其包装在Hystrix命令中,您将有一个选项来定义回退操作,在这里您将停止JMS侦听器。在这一点上,消息将停止出现。当DB连接重新出现时,您重新启动侦听器,一切都恢复正常。想想看,你们甚至并没有断路器的案例,因为我刚才描述的一切都是可以实现的,并没有断路器,更简单。