繁体   English   中英

启用@KafkaListener以从application.yml文件中获取可变主题名称

[英]Enabling @KafkaListener to take in variable topic names from application.yml file

我试图在多个主题加载到一个@KafkaListener但我遇到了麻烦,因为我相信它正在寻找一个恒定值,但初始化topics从变量application.yml文件造成什么问题,我如果有人能够知道帮助我解决此问题,或为我提供有关如何将多个Kafka主题加载到单个KafkaListener中的指导。

通过将它们传递@KafkaListener逗号分隔的对象,我可以在同一个@KafkaListener收听多个主题,如下所示:

@KafkaListener(topics = {
           "flight-events",
           "flight-time-events",
           "service-events",
           "flight-delay-events"
   })

我意识到我可以用逗号分隔的值表示主题的对象,但是我希望能够通过配置文件添加主题,而不是更改代码库中的代码。

我相信可能存在问题,因为@KafkaListener需要采用一个常量值,而我无法将注释定义为常量,对此有什么办法吗?

KafkaWebSocketConnector.java

@Component
public class KafkaWebSocketConnector
{


   @Value("${spring.kafka.topics}")
   private String[] topics;

   @KafkaListener(topics = topics)
   public void listen(ConsumerRecord<?, Map<String, String>> message)
   {
      log.info("Received messages on topic [{}]: [{}]", message.topic(), message.value());
      String dest = "/" + message.topic();
      log.info("destination = {}", dest);
      log.info("msg: {}", message);
      messageTemplate.convertAndSend(dest, message.value());
   }
}

application.yml

spring:
  kafka:
    consumer:
      auto-offset-reset: earliest
      group-id: kafka-websocket-connector
    topics: flight-events,
      flight-time-events,
      canceled-events,
      pax-events,
      flight-delay-events

@Gary Russell从此GitHub问题提供的答案:

https://github.com/spring-projects/spring-kafka/issues/361

您可以使用SpEL表达式; 在EnableKafkaIntegrationTests中有一个示例...

@KafkaListener(id = "foo", topics = "#{'${topicOne:annotated1,foo}'.split(',')}")

在我的情况下为"#{'${spring.kafka.topics}'.split(',')}"

为了回答上述问题,我能够实现上述代码(由Gary Russell提供)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM