使用Spring Integration启动Spring Boot应用程序Kafka消费者暂停了

时间:2018-04-23 17:56:06

标签: java spring spring-boot apache-kafka spring-integration

我正在开发一个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在暂停状态下启动,在其他某个进程完成后可以取消暂停?

1 个答案:

答案 0 :(得分:1)

我假设您使用KafkaMessageDrivenChannelAdapter并且根据您提到的Spring Integration Java DSL - Kafka.messageDrivenChannelAdapter()来确切。可以使用idautoStartup(false)配置该版本。因此,它不会立即开始消耗Kafka主题。每当您准备好使用时,您可以start()此组件使用提到的ID从应用程序上下文中将其作为Lifecycle获取。

或者您可以向Control Bus发送相应的消息。

<强>更新

如果您处理Spring Cloud Stream和Kafka Binder,您应该考虑注入一个BindingsEndpoint bean,并为绑定名称和changeState(@Selector String name, State state)执行State.STOPPED。当您的内存数据库准备好后,您可以使用State.STARTEDhttps://docs.spring.io/spring-cloud-stream/docs/Elmhurst.RELEASE/reference/htmlsingle/#_binding_visualization_and_control

回拨它