为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

浮云间 2022-01-19 09:47:11
在我的项目中,我有很多弹簧管理的组件做同样的事情。我想创建一个通用的 Util 类,为我的所有组件执行所有通用操作。由于这个 Util 类需要访问环境变量和 bean,它的实例化如下:// Util class:public class FooUtil {    public FooUtil(Environment env) {        env.getProperty("FOO_TOPIC", "foo")    }}// Example configuration for one of my components:@Configurationpublic 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 在它被组件实例化和初始化后立即开始监听。
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

由于 FooUtil 不是由 Spring 管理的,因此您无法使用 @KafkaListener 注释。如果 FooUtil 是 Spring 管理的 bean,它将被 Spring 拾取,并且 listener 注释将导致 Spring 连接 listener。我相信所有这些都是由 Spring 在 KafkaListenerAnnotationBeanPostProcessor 中完成的。

FooUtil 是否必须是非托管 bean?我可能会遗漏一些细节,但从问题中我看不出为什么不可能。如果您需要为每个使用它的 bean 提供不同的实例,您可以@Scope("prototype")在 FooUtil 上使用。


查看完整回答
反对 回复 2022-01-19
?
慕的地10843

TA贡献1785条经验 获得超8个赞

事实证明,您可以在不使用 @KafkaListener 注释的情况下创建一个 kafka 侦听器(感谢 Gary Russell)。只需按照此处(douevencode.com)的说明进行操作即可。


查看完整回答
反对 回复 2022-01-19
  • 2 回答
  • 0 关注
  • 262 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信