如何使用@KafkaListner批注订阅多个主题

时间:2019-07-03 19:18:29

标签: apache-kafka kafka-consumer-api

我正在使用Kafka消息代理发布和订阅事件。对于那些使用spring基础设施的人。我的要求是我需要创建一个将订阅多个主题的消费者。

下面的代码在订阅单个主题时效果很好。

@KafkaListener(topics = "com.customer.nike")
  public void receive(String payload) {
    LOGGER.info("received payload='{}'", payload);
  }

但是我想要,它应该订阅某种主题模式。 喜欢..

   @KafkaListener(topics = "com.cusotmer.*.nike")
      public void receive(String payload) {
        LOGGER.info("received payload='{}'", payload);
      }

在此代码中*会不断变化。它可能是一些数值,例如1000。1010,依此类推。为此,我还使用了SpeL。

   @KafkaListener(topics = "#{com.cusotmer.*.nike}")
      public void receive(String payload) {
        LOGGER.info("received payload='{}'", payload);
      }

但是这个也不适合我。 有人可以帮我订阅多个主题。

先谢谢了。

2 个答案:

答案 0 :(得分:1)

关于多种主题的订阅,您可以使用topicPatterns来实现:

  

此侦听器的主题模式。条目可以是“主题   模式”,“属性占位符键”或“表达式”。的   框架将创建一个订阅所有主题的容器   匹配指定的模式以获取动态分配的分区。   模式匹配将针对主题定期执行   检查时已存在。表达式必须解析为   主题模式(支持字符串或模式结果类型)。

     

与topic()和topicPartitions()互斥。

@KafkaListener(topicPattern = "com.customer.*")
  public void receive(String payload) {
    LOGGER.info("received payload='{}'", payload);
  }

关于对主题名称的程序访问,您可以使用带注释的@Header方法提取由KafkaHeaders定义的特定标头值,在您的情况下为{ {3}}:

  

包含接收消息的主题的标题。

@KafkaListener(topics = "com.customer.nike")
    public void receive(String payload, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
    LOGGER.info("received payload='{}'", payload);
    LOG.info("received from topic: {}", topic);
    }

答案 1 :(得分:0)

我使用@KafkaListener(topics = "#{'${kafka.topics}'.split(',')}",其中kafka.topics是从我的属性文件中提取的,并且包含用逗号分隔的主题,我的听众应该听这些主题。

但是可能是,在启动过程中,您可以添加逻辑以生成所有可能的主题并分配给变量,该变量以后可以如上使用。

更新:可以使用通配符,如下面的亚历山大评论所述。