在我的项目中,我有很多可以完成相同操作的spring管理组件。我想创建一个通用的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在组件实例化和初始化后立即开始监听。
最佳答案
由于FooUtil不是由Spring管理的,因此您无法使用@KafkaListener注释。如果FooUtil是由Spring管理的bean,它将由Spring拾取,并且侦听器注释将导致Spring连接侦听器。我相信所有这些都是由Spring在KafkaListenerAnnotationBeanPostProcessor中完成的。
FooUtil是否必须是非托管bean?我可能会丢失一些细节,但是从问题中我看不出为什么不应该这样做。如果每个使用它的bean需要不同的实例,则可以在FooUtil上使用@Scope("prototype")
。
关于java - 在非Spring管理的类中使用KafkaListener,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53281075/