我开发了一个kafka监听器。这是我设计的不同课程:
Class KafkaProperties {
public String topicZZZ;
public String groupId;
...
}
Class KafkaConfig {
@Bean
@Primary
public KafkaProperties populateKafkaProperties() {
KafkaProperties obj = new KafkaProperties();
obj.settopicZZZ("kafkaTopicName");
return obj;
}
}
Class B {
@Autowired
KafkaConfig kafkaConfig;
@Autowired
KafkaProperties kafkaProps;
@KafkaListener(topics = {"#{'kafkaProps.topicZZZ'}" },
groupId = "#{'kafkaProps.groupId'}", containerFactory = "onlineKafkaListenerContainerFactory")
public void consumeOnlineMessages() {
log.info();
}
}
当我启动我的应用程序时,没有错误,但它似乎没有选择主题名称,因为我无法使用任何消息。
我可以在日志中看到这一行:
Subscribed to topic(s): kafkaProps.topicZZZ
但是当我使用以下内容从属性文件传递主题名称时
@kafkaListener
我得到了正确的主题名称。
@KafkaListener(topics = {"${kafka.topicNamefromPropFile}" },
groupId = "${kafka.groupid}",
所以很明显以下内容不起作用:
@KafkaListener(topics = {"#{'kafkaProps.topicZZZ'}" },
我遵循了spring docs
的语义那里提到我们可以像下面一样使用,但这会引发与解析拼写表达式相关的错误:
@KafkaListener(topics = "#{someBean.someProperty}",
groupId = "#{someBean.someProperty}.group")
编辑:我可以看到 ConsumerConfig 值已正确加载,如果有人需要从那里查看任何属性,请告诉我。 有人可以帮助我在监听器中正确使用主题名称吗?
由于这些引号,您的
#{'kafkaProps.topicZZZ'}
表达式仅解析为纯字符串。
文档中的
#{someBean.someProperty}
表达式表示:在应用程序上下文中找到 someBean
并调用其 getSomeProperty()
方法。
在您的情况下,您似乎认为它是关于您刚刚使用
@KafkaListener
自动连接到您的类中的属性。
看看您是否可以确定
KafkaProperties
bean 名称并在此 SpEL 表达式中准确使用该名称,当然不带引号。