繁体   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