我正在开发一个Spring Boot应用程序,该应用程序使用以Kafka主题为源的Spring Integration流程。我们的集成流程开始使用包含SubscribableChannels的接口和springframework.cloud.stream.annotation.Input和Output注释。这些配置为使用spring.cloud.stream.kafka.bindings通过Cloud Config从Kafka读取。
当应用程序首次启动时,它会立即开始阅读Kafka主题。这是一个问题,因为应用程序需要初始化一些本地的,不可持久的数据库才能开始正确处理传入的Kafka消息。
我们目前正在使用@PostConstruct在Kafka启动之前填充这些内存数据库,但这不是最理想的,因为应用程序无法使用Eureka,Feign等来可靠地找到具有最新数据的健康服务内存数据库。
由于各种原因,无法更改体系结构,以便共享或预填充内存数据库。要知道,当我把它称为内存数据库时,我简化了一些事情,它实际上是另一种服务。
启动Spring Boot应用程序的最佳方法是什么,从Kafka读取的Integration Flow在暂停状态下启动,在其他某个进程完成后可以取消暂停?
答案 0 :(得分:1)
我假设您使用KafkaMessageDrivenChannelAdapter
并且根据您提到的Spring Integration Java DSL - Kafka.messageDrivenChannelAdapter()
来确切。可以使用id
和autoStartup(false)
配置该版本。因此,它不会立即开始消耗Kafka主题。每当您准备好使用时,您可以start()
此组件使用提到的ID从应用程序上下文中将其作为Lifecycle
获取。
或者您可以向Control Bus发送相应的消息。
<强>更新强>
如果您处理Spring Cloud Stream和Kafka Binder,您应该考虑注入一个BindingsEndpoint
bean,并为绑定名称和changeState(@Selector String name, State state)
执行State.STOPPED
。当您的内存数据库准备好后,您可以使用State.STARTED
:https://docs.spring.io/spring-cloud-stream/docs/Elmhurst.RELEASE/reference/htmlsingle/#_binding_visualization_and_control