我有一个应用程序,它从 Kafka 获取消息并调用目标系统来更新旧版 Oracle 数据库。
我想启用一个场景,如果目标系统关闭,则将消息留在 Kafka 总线上,并且在给定的时间内不处理它们。我正在考虑一些基于 Hystrix 的断路器解决方案,但我找不到任何机制来告诉 Spring Cloud Stream “停止”事件监听。我能想到的唯一其他选择是,如果断路器打开,则将这些消息传输到错误/重新处理主题,但这对我来说听起来像是反模式。我应该能够暂停系统处理事件,这就是微服务应用程序中发布/订阅的全部优势。
如有任何帮助,我们将不胜感激。
最佳答案
一种解决方案是自动连接应用程序上下文。
@Autowired
private ConfigurableApplicationContext context;
您可以stop()
和start()
上下文。
不过,您不应该在调用 @StreamListener 的线程上调用 stop()
,否则停止将被延迟(因为容器将等待该线程默认退出 5 秒 - 至少使用 Rabbit Binder )。
当然,您将需要某种带外机制来重新启动 - 也许是 JMX 或监听某种控制主题的单独应用程序上下文。
关于apache-kafka - 当目标系统关闭时,停止 Spring Cloud Stream @StreamListener 监听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39598943/