Spring boot @KafkaListener 不使用框架中提到的 SPEL 监听主题名称

问题描述 投票:0回答:1

我开发了一个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 值已正确加载,如果有人需要从那里查看任何属性,请告诉我。 有人可以帮助我在监听器中正确使用主题名称吗?

java spring-boot apache-kafka spring-kafka
1个回答
0
投票

由于这些引号,您的

#{'kafkaProps.topicZZZ'}
表达式仅解析为纯字符串。

文档中的

#{someBean.someProperty}
表达式表示:在应用程序上下文中找到
someBean
并调用其
getSomeProperty()
方法。

在您的情况下,您似乎认为它是关于您刚刚使用

@KafkaListener
自动连接到您的类中的属性。

看看您是否可以确定

KafkaProperties
bean 名称并在此 SpEL 表达式中准确使用该名称,当然不带引号。

© www.soinside.com 2019 - 2024. All rights reserved.