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

Stop Spring Cloud Stream @StreamListener from listening when target system is down

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

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

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

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

@Autowired
private ConfigurableApplicationContext context;

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

你不应该在调用 @StreamListener 的线程上调用 stop(),否则停止将被延迟(因为默认情况下容器将等待该线程退出 5 秒 -至少有一个兔子活页夹)。

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