在我的项目中,我有很多可以完成相同操作的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/

10-16 21:32