2017-07-05 706 views
2

我試圖將多個主題加載到單個@KafkaListener,但由於我相信它正在尋找一個常量值,但初始化topics變量從application.yml文件導致的問題,我想知道如果有人可以幫我解決這個問題,或者提供我如何將多個Kafka主題加載到單個KafkaListener中的方向。啓用@KafkaListener從application.yml文件中獲取可變主題名稱

我能夠通過將其在一個逗號分隔的對象聽在同一@KafkaListener多個主題,如下圖所示:

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

我知道我可以做一個物體與代表的主題逗號分隔值,但我希望能夠通過配置文件添加主題,而不是更改代碼庫中的代碼。

我認爲可能存在的問題是@KafkaListener需要一個常量值,而我無法將一個註釋定義爲一個常量,有沒有辦法解決這個問題?從@Gary羅素從這個GitHub的問題提供了

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 

回答

2

答:

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

您可以使用規劃環境地政司表達;還有一個例子,EnableKafkaIntegrationTests ...

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

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

我能夠爲了回答上述問題,以實現上述代碼,(由加利羅素提供)。

+0

這就是所謂的*剽竊* ...你有沒有創建GH問題的問題,請。 –

+0

對不起Artem,我知道你是Gary的標籤團隊,是否有更好的引用,我可以用這個來解決你的問題? – terrabl

+0

你必須添加鏈接到GH問題的更多信息,並接受你的答案。將來請記住,我們可能無法在線回答有關GH的問題。這就是爲什麼SO是最好的開始。 –