在不受 Spring 管理的类中使用 KafkaListener

在我的项目中,我有很多弹簧管理的组件做同样的事情。我想创建一个通用的 Util 类,为我的所有组件执行所有通用操作。由于这个 Util 类需要访问环境变量和 bean,它的实例化如下:


// Util class:

public class FooUtil {

    public FooUtil(Environment env) {

        env.getProperty("FOO_TOPIC", "foo")

    }

}


// Example configuration for one of my components:

@Configuration

public class ComponentConfig {

    @Bean

    FooUtil fooUtil(Environment env) {

        return new FooUtil(env);

    }

}

这允许 FooUtil 访问所有环境变量和 bean,而无需它本身就是一个组件。


现在,这个Util类也需要听kafka的话题。每个组件当前都有一个侦听器,如下所示:


@KafkaListener(topics = "${FOO"_TOPIC:foo2}", containerFactory = "kafkaListenerContainerFactory")

private void fooListener(ConsumerRecord<String, Foo> rec) {

    // Stuff...

}

我想把这个 kafka 监听器移到 FooUtil 中。我怎样才能做到这一点?需要明确的是,我希望 FooUtil 在它被组件实例化和初始化后立即开始监听。


浮云间
浏览 263回答 2
2回答

SMILET

由于 FooUtil 不是由 Spring 管理的,因此您无法使用 @KafkaListener 注释。如果 FooUtil 是 Spring 管理的 bean,它将被 Spring 拾取,并且 listener 注释将导致 Spring 连接 listener。我相信所有这些都是由 Spring 在 KafkaListenerAnnotationBeanPostProcessor 中完成的。FooUtil 是否必须是非托管 bean?我可能会遗漏一些细节,但从问题中我看不出为什么不可能。如果您需要为每个使用它的 bean 提供不同的实例,您可以@Scope("prototype")在 FooUtil 上使用。

慕的地10843

事实证明,您可以在不使用 @KafkaListener 注释的情况下创建一个 kafka 侦听器(感谢 Gary Russell)。只需按照此处(douevencode.com)的说明进行操作即可。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java