【问题标题】: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 注释内容的工作方式是否相同?

【问题讨论】:

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

标签: spring spring-boot apache-kafka spring-kafka


【解决方案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
  • 谢谢大家。这是一个很棒的社区!
猜你喜欢
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 2019-01-11
  • 2014-09-08
  • 1970-01-01
  • 2010-09-23
相关资源
最近更新 更多