如何将动态主题名称传递给@kafkalistener(环境变量中的主题

时间:2019-01-04 12:23:54

标签: java spring-boot kafka-consumer-api spring-kafka

我正在写卡夫卡消费者  我想将环境变量主题名称传递给@kafkalistener(topics = topic

 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()}'}”   在这条线  抛出错误。我的应用程序无法启动。必须根据环境变量动态设置此主题名称。

2 个答案:

答案 0 :(得分:0)

通常,您不能从声明SpEL的bean中引用字段或属性。但是,@KafkaListener具有支持它的特殊语法。

See the documentation

  

从版本2.1.2开始,SpEL表达式支持特殊的标记__listener,这是一个伪bean名称,代表该注释所在的当前bean实例。

因此,如果您将public EnvProperties getEnvProperties()添加到类中,则类似

#{__listener.envProperties.topic}

应该工作。

答案 1 :(得分:0)

在KafkaConsumer类中,您需要进行以下更改:

@Autowired
public EnvProperties envProperties;

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

对我有用。