当目标系统关闭时,停止 Spring Cloud Stream @StreamListener 监听

Posted

技术标签:

【中文标题】当目标系统关闭时,停止 Spring Cloud Stream @StreamListener 监听【英文标题】:Stop Spring Cloud Stream @StreamListener from listening when target system is down 【发布时间】:2017-01-28 15:56:57 【问题描述】:

我有一个从 Kafka 获取消息并调用目标系统来更新旧版 Oracle 数据库的应用程序。

我想启用一个场景,如果目标系统关闭,则将消息留在 Kafka 总线上并且在给定的时间段内不处理它们。我正在考虑一些基于断路器 Hystrix 的解决方案,但我找不到任何机制来告诉 Spring Cloud Stream“停止”事件监听。我能想到的唯一其他选择是如果断路器打开,将这些消息传输到错误/重新处理主题,但这对我来说听起来像是一种反模式。我应该能够暂停系统处理事件,这是微服务应用中发布/订阅的全部优势。

如有任何帮助,将不胜感激。

【问题讨论】:

【参考方案1】:

一种解决方案是自动连接应用程序上下文。

@Autowired
private ConfigurableApplicationContext context;

您可以stop()start() 上下文。

您不应该在调用@StreamListener 的线程上调用stop(),否则停止将被延迟(因为默认情况下容器将等待该线程退出 5 秒 - 至少使用 Rabbit binder )。

当然,您将需要某种带外机制来重新启动 - 可能是 JMX 或单独的应用程序上下文侦听某种控制主题。

【讨论】:

好主意!我会试一试。我的猜测是这不会是一个功能齐全的断路器解决方案,因为我猜测停止上下文会停止整个应用程序,但这是一个很好的起点。 这很好用。一旦达到某个错误阈值,我将停止上下文并进入一个简单的 while 循环来测试服务器是否启动(内部有 30 秒)。服务器启动后,我只需再次调用 context.start() 即可。因此,甚至不需要 JMX 或其他任何东西,在这种情况下,该过程是一种自我修复,同时消息继续在 Kafka 中排队。当然,我不能在 ping 方法中使用任何 Spring 功能,但这没关系,因为它非常简单。再次感谢! 请参阅 this answer,了解停止/启动单个绑定而不是整个应用上下文的解决方案。

以上是关于当目标系统关闭时,停止 Spring Cloud Stream @StreamListener 监听的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud实战小贴士:Zuul处理Cookie和重定向

(十六) 整合spring cloud云架构 -使用spring cloud Bus刷新配置

实例关闭时Spring-cloud Zuul重试

网关服务——Spring Cloud Gateway

Spring Cloud Gateway入坑记

07.spring cloud 后台管理系统