簡體   English   中英

如何將動態主題名稱從環境變量傳遞給@KafkaListener(topics)

[英]How to pass dynamic topic name to @KafkaListener(topics) from environment variable

我正在寫一個 Kafka 消費者。 我需要將環境變量主題名稱傳遞給@KafkaListener(topics = ...) 這是我到目前為止所嘗試的:

 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.kafka.annotation.KafkaListener; 
 import org.springframework.stereotype.Service;

 @Service
 public class KafkaConsumer {

     @Autowired
     private EnvProperties envProperties;

     private final String topic = envProperties.getTopic();

     @KafkaListener(topics = "#{'${envProperties.getTopic()}'}", groupId = "group_id")
     public void consume(String message) {
        logger.info("Consuming messages " +envProperties.getTopic());
     }
}

我在topics = "#{'${envProperties.getTopic()}'}"行遇到錯誤,應用程序無法啟動。

如何從環境變量中動態設置此主題名稱?

通常,您不能從聲明 SpEL 的 bean 中引用字段或屬性。 但是, @KafkaListener有特殊的語法來支持它。

請參閱文檔

從版本 2.1.2 開始,SpEL 表達式支持一個特殊的標記__listener ,它是一個偽 bean 名稱,表示存在此注釋的當前 bean 實例。

因此,如果您將public EnvProperties getEnvProperties()添加到類中,則類似於

#{__listener.envProperties.topic}

應該管用。

在 KafkaConsumer 類中,您需要進行以下更改:

@Autowired
public EnvProperties envProperties;

@KafkaListener(topics = "#{kafkaConsumer.envProperties.getTopic()}"

它對我有用。

如果您希望將主題設置為環境變量,您可以傳遞下面的主題

@KafkaListener(topics = "#{systemEnvironment['TOPIC']}")

然后你可以設置如下主題,

export TOPIC=mytopic

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM