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.properties
或application.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 Kafka 和 Spring Integration Kafka 的区别
kafka:spring集成 kafka(springboot集成客户端集成)