Spring Kafka KafkaListener 注释是不是能够将配置属性作为主题名称?

Posted

技术标签:

【中文标题】Spring Kafka KafkaListener 注释是不是能够将配置属性作为主题名称?【英文标题】:Is Spring Kafka KafkaListener annotation able to take config property as topic name?Spring Kafka KafkaListener 注释是否能够将配置属性作为主题名称? 【发布时间】:2022-01-20 03:38:34 【问题描述】:

我有以下定义:

    @KafkaListener(
            topics = "$app.kafka.eventTopic",
            groupId = "$app.kafka.consumerGroupId",
            concurrency = "$app.kafka.concurrency"
    )

我在我的 yaml 文件中定义了这些配置属性,例如:

app:
  kafka:
    eventTopic: topicName
    consumerGroupId: groupName
    concurrency: 10

我是 SpringBoot 的新手,我看到一些 SO 帖子声称 $app.kafka.eventTopic 之类的语法不能像 @Value() 注释那样工作,需要 ConfigurationProperties 类将属性值“翻译”为 Java变量。如果 @Value 注释是这样,那么这里对 KafkaListener 注释内容的工作方式是否相同?

【问题讨论】:

测试一下就知道了。注解属性中的占位符的替换需要添加到注解的注解处理器中。注释只不过是元数据。所以它需要在处理器中,如果它不在处理器中,则不受支持。 【参考方案1】:

这应该可以在没有任何“翻译器”的普通 Spring Boot 应用程序中工作。例如。只要相应的属性在您的application.propertiesapplication.yaml 中,这应该可以正常工作:

@KafkaListener(
    topics = "$kafka.topics.consume.somedata", 
    id = MyConsumer.CONTAINER_ID)

您甚至可以使用更高级的 SPeL 表达式,例如:

@KafkaListener(topics = "#'$consumer.topics'.split(',')", ...)

您可以阅读有关 SpEL 的更多信息here。

实际上,Value 和 KafkaListener 注释的处理方式略有不同。一个来自AutowiredAnnotationBeanPostProcessor,另一个来自KafkaListenerAnnotationBeanPostProcessor。

【讨论】:

另见相应文档:docs.spring.io/spring-kafka/docs/current/reference/html/…。这与 Spring Boot 无关。这就是 Spring Boot 没有关于此事的任何文档的原因。 配置属性必须在kafka.topics 下吗?或者我可以把它放在像app.kafka.topic这样的任何属性中? @return0 你可以使用任何属性,例如app.kafka.topic 谢谢大家。这是一个很棒的社区!

以上是关于Spring Kafka KafkaListener 注释是不是能够将配置属性作为主题名称?的主要内容,如果未能解决你的问题,请参考以下文章

spring boot怎么启动kafka

Spring Kafka 和 Spring Integration Kafka 的区别

kafka:spring集成 kafka(springboot集成客户端集成)

Spring生态研习:Spring-kafka

解决 spring boot 访问 docker kafka 失败

spring boot引入kafka