如何通过代码在KafkaListener中设置主题名称?

时间:2019-12-03 14:29:21

标签: apache-kafka kafka-consumer-api spring-kafka

我正在编写kafka主题的侦听器,并使用@kafkaListener注释执行相同的操作。直到现在,我都硬编码了主题名称(topic1),并且工作正常。这是一个有效的代码:-

@Component
public class KafkaConsumer {

@Autowired
private KafkaProperties kafkaProps;


@Autowired
@Qualifier("CustomObjectMapper")
private ObjectMapper objectMapper;

@KafkaListener(topics = "topic1", containerFactory = "createPokafkaListenerContainerFactory")
public void CreatePoListener(PurchaseOrder po, Acknowledgment ack)
    throws JsonProcessingException {

    LOG.info("Received message for po create from kafka topic {} is {}",
        kafkaProps.getOmsCreateTopicName(), objectMapper
            .writerWithDefaultPrettyPrinter().writeValueAsString(po));

    ack.acknowledge();


}

}

现在,当我尝试更改代码以从代码中获取主题名称时,它不起作用。在堆栈溢出(How to pass dynamic topic name to @kafkalistener(topics from environment variable)中跟随此页面后,我尝试从代码中获取值的代码是:-

@Component
public class KafkaConsumer {

@Autowired
private KafkaProperties kafkaProps;

public KafkaProperties getKafkaProps() {
    return kafkaProps;
}

@Autowired
@Qualifier("CustomObjectMapper")
private ObjectMapper objectMapper;

@KafkaListener(topics = "#{__listener.kafkaProps.getOmsCreateTopicName()}", containerFactory = "omsCreatePokafkaListenerContainerFactory")
    public void CreatePoListener(PurchaseOrder po, Acknowledgment ack)
    throws JsonProcessingException {

    LOG.info("Received message for po create from kafka topic {} is {}",
        kafkaProps.getOmsCreateTopicName(), objectMapper
            .writerWithDefaultPrettyPrinter().writeValueAsString(po));

    ack.acknowledge();


}

}

当我尝试携带服务器时,它会抛出错误:-

Bean初始化失败;嵌套异常为org.springframework.beans.factory.BeanExpressionException:表达式解析失败;嵌套异常是org.springframework.expression.spel.SpelEvaluationException:EL1008E:在类型为“ org.springframework.beans.factory.config.BeanExpressionContext”的对象上找不到属性或字段“ __listener”-可能不是公共的?

有人可以在这里帮助我,我在这里做错了吗?

2 个答案:

答案 0 :(得分:2)

1.1.x不再受支持;如果您不能升级到Spring Framework 4.3以上,则应该升级到1.3.10,这是与Spring 4.3一起使用的最新版本。多亏了KIP-62,它的代码模型比1.1.x简单,可靠得多。

虽然您无法将Microsoft.Azure.ServiceBus与1.3.x一起使用,但是可以使用SpEL表达式直接从__listener bean中获取主题:

KafkaProperties

答案 1 :(得分:0)

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

@Autowired
public KafkaProperties kafkaProps;

@KafkaListener(topics = "#{kafkaConsumer.kafkaProps.getOmsCreateTopicName()}"

对我有用。