Используйте KafkaListener в классе, не управляемом Spring - PullRequest
0 голосов
/ 13 ноября 2018

В моем проекте у меня много компонентов с пружинным управлением, которые примерно одинаковы.Я хочу создать общий класс 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 также должен слушать темы Кафки.В настоящее время каждый компонент имеет прослушиватель, настроенный так:

@KafkaListener(topics = "${FOO"_TOPIC:foo2}", containerFactory = "kafkaListenerContainerFactory")
private void fooListener(ConsumerRecord<String, Foo> rec) {
    // Stuff...
}

Я хочу переместить слушателя kafka в FooUtil.Как я могу это сделать? Чтобы было ясно, я хочу, чтобы FooUtil начал слушать, как только он был создан и инициализирован компонентом.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Оказывается, вы можете сделать слушателя kafka без использования аннотации @KafkaListener (спасибо Гари Расселу). Просто следуйте инструкциям здесь (douevencode.com) для получения инструкций о том, как это сделать.

0 голосов
/ 13 ноября 2018

Поскольку Spring не управляет FooUtil, вы не можете использовать аннотацию @KafkaListener. Если FooUtil был bean-компонентом, управляемым Spring, он будет выбран Spring, и аннотация прослушивателя заставит Spring подключить слушателя. Все это сделано Spring в KafkaListenerAnnotationBeanPostProcessor Я верю.

Должен ли FooUtil быть неуправляемым компонентом? Возможно, мне не хватает некоторых деталей, но из вопроса я не понимаю, почему это не должно быть возможно. Если вам нужны разные экземпляры для каждого компонента, использующего его, вы можете использовать @Scope("prototype") в FooUtil.

...