【问题标题】:How to disable a Spring Cloud Stream Kafka consumer如何禁用 Spring Cloud Stream Kafka 消费者
【发布时间】:2022-01-11 23:03:12
【问题描述】:

这是我的情况:

我们有一个 Spring cloud Stream 3 Kafka 服务连接到同一代理中的多个主题,但我想根据属性控制连接到特定主题。

每个主题都有自己的活页夹和绑定,但代理对所有人都是一样的。

我尝试通过使用下面的属性禁用绑定(这是迄今为止我找到的唯一解决方案),它适用于 StreamListener 不接收消息,但与主题的连接和重新平衡仍在发生。

spring:
  cloud:
    stream:
      bindings:
        ...
        anotherBinding:
          consumer:
            ...
            autostartup: false
  

我想知道活页夹级别是否有任何设置阻止它启动。消费者主题之一应仅在其中一种环境中可用。

谢谢

【问题讨论】:

    标签: apache-kafka spring-cloud-stream


    【解决方案1】:

    通过将autoStartup 设置为false 来禁用绑定应该可以,但我不确定是什么问题。

    看起来您使用的不是新功能模型,而是StreamListener。如果您使用的是功能模型,那么您可以尝试另一件事。您可以通过在运行时不包括相应的函数来禁用绑定。例如,假设您有以下两个消费者。

    @Bean
    public Consumer<String> one() {}
    
    @Bean
    public Consumer<String> two() {}
    
    

    运行此应用时,您可以提供属性spring.cloud.function.definition 来包含/排除功能。例如,当您使用spring.cloud.function.definition=one 运行它时,消费者two 将根本不会被激活。当使用spring.cloud.function.definition=two 运行时,消费者one 将不会被激活。

    上述方法的缺点是,如果您决定在应用程序启动后启动另一个功能(假设 autoStartup 在另一个功能上是 false),它将无法工作,因为它不是原始的一部分通过spring.cloud.function.definition 绑定。但是,根据您的要求,这可能不是问题,因为您知道哪些环境是针对相应主题的。换句话说,如果您知道消费者one 需要始终从主题one 消费,那么您就不要将消费者two 作为定义的一部分。

    【讨论】:

    • 嗨 sobychacko,感谢您的回答。对于新项目,我们已经使用 kafka 消费者作为函数式编程,但另一个项目是遗留项目,仍然使用旧方式。是的,在传统中使用 autoStartup: false 会阻止 StreamListener 接收消息,但我们仍然可以连接到主题并进行重新平衡。现在,我们将在代码中将此绑定器注释掉,而我们不会迁移到函数式编程消费者 bean。谢谢!
    猜你喜欢
    • 2016-06-21
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2023-02-08
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多