[英]Can you give priority to a single topic when KafkaListener listens to multiple 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.