在非Spring管理的类中使用KafkaListener

时间:2018-11-13 12:31:47

标签: java spring listener spring-kafka

在我的项目中,我有很多由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在组件实例化和初始化后立即开始监听。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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