【问题标题】:KafkaListener not resolving containerFactory with "#{__listener.getContainerFactory()}"KafkaListener 未使用“#{__listener.getContainerFactory()}”解析 containerFactory
【发布时间】:2021-03-31 02:29:54
【问题描述】:

我正在使用以下方法来获取 KafkaListener 属性。 但它不解析 containerFactory 值。但它适用于主题和 groupId。

@KafkaListener(topics = "#{__listener.getTopics()}",
            groupId = "#{__listener.getGroupId()}",
            containerFactory =  "#{__listener.getContainerFactory()}")
    public void sampleTestTopicListener(@Payload byte[] data,

.....
 @Value("sampleTestListenerContainerFactory")
    private String containerFactory ;

    public String  getContainerFactory(){
        return containerFactory;
    }
....
Spring-kafka-2.2.5.RELEASE 

I get the following error :
A component required a bean named '#{__listener.getContainerFactory()}' that could not be found.

Changing the containerFactory value to "sampleTestListenerContainerFactory" instead of spEL, it works fine.

如何使用当前的 beans 属性设置它?

【问题讨论】:

    标签: spring-kafka


    【解决方案1】:

    @KafkaListener 注释上的 containerFactory 选项不能作为 SpEL 表达式。不过,您可以使用属性占位符解析。像这样:

    containerFactory = "${sampleTestListenerContainerFactory}"
    

    但最好还是使用真正的 bean 名称:KafkaListenerContainerFactory 真的必须是 bean...

    另一个注意事项:Apache Kafka 2.2.5 的 Spring 版本不支持。它在很久以前就达到了生命的尽头。保持最新版本更实用:https://spring.io/projects/spring-kafka#learn

    【讨论】:

    • 非常感谢您的回答。我的要求是提供一个基本的侦听器处理程序,并且在派生类中,基类的客户端可以提供这些属性,这样每个客户端都不需要编写完整的处理程序签名 ``` @KafkaListener(..attributes 在派生类中给出) public void sampleTopicListener( @Payload byte[] data, @Header...{ loginfo(..) processmessage(data) - 派生类将覆盖此函数) commit ``` containerfactory 不支持 spEL 的原因是什么?还有其他选择吗?
    • 这个containerFactory选项真的有必要吗?请参阅其 JavaDocs If not specified, the default container factory is used, if any.。所以,你可以省略这个选项,你的类的实现者必须只提供一个kafkaListenerContainerFactory bean。
    • 这会将 containerFactory 限制为仅一个消费者配置。多个派生类不能为containerfactory 指定一个单独的默认bean,因为在同一个应用程序中只有一个kafkaListenerContainerFactory 类型的bean? concurrentKafkaListenerContainerFactory.setConsumerFactory(客户端需要的配置)
    • 好的。同意你的看法:github.com/spring-projects/spring-kafka/issues/1661。目前不可能,但我们会寻求所需的支持。
    • 虽然我们应该在这里支持表达式,但通常最好使用单个容器工厂(尤其是 Spring Boot)并为其添加ContainerCustomizer,以调整工厂创建的每个容器的属性.有关示例,请参见 this answer
    猜你喜欢
    • 2021-12-17
    • 2019-09-16
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2017-12-22
    相关资源
    最近更新 更多