在我的项目中,我有很多弹簧管理的组件做同样的事情。我想创建一个通用的 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 上使用。
慕的地10843
TA贡献1785条经验 获得超8个赞
事实证明,您可以在不使用 @KafkaListener 注释的情况下创建一个 kafka 侦听器(感谢 Gary Russell)。只需按照此处(douevencode.com)的说明进行操作即可。
添加回答
举报
0/150
提交
取消