Как запустить Kafka Listener вручную? - PullRequest
0 голосов
/ 09 января 2020

У меня есть некоторые методы, помеченные @KafkaListener, но я хочу запустить только некоторые из них вручную (в зависимости от некоторых условий).

@KafkaListener(id = "consumer1", topics = "topic-name", clientIdPrefix = "client-prefix", autoStartup = "false")
public void consumer1(String message) {
    // consume
}
@PostConstruct
private void startConsumers() {
    if (true) {
        kafkaListenerEndpointRegistry.getListenerContainer("consumer1").start();
    }
}

Но в данный момент kafkaListenerEndpointRegistry.getListenerContainers() пусто список и kafkaListenerEndpointRegistry.getListenerContainer("consumer1") возвращает null. Поэтому, возможно, момент, когда вызывается метод @PostConstruct, слишком ранний, и слушатели все еще не зарегистрированы. Я попытался аннотировать метод startConsumers() с помощью @Scheduled(fixedDelay = 100), и слушатели уже доступны. Но использование @Scheduled не является хорошим решением для того, что я хочу вызвать один раз после запуска приложения.

1 Ответ

2 голосов
/ 09 января 2020

Вы не можете сделать это в @PostConstruct - это слишком рано в жизненном цикле контекста приложения.

Реализация SmartLifecyle установите фазу на Integer.MAX_VALUE и запустите контейнер в start() method.

Или используйте @EventListener и прослушайте ApplicationStartedEvent (при использовании Spring Boot) или ContextRefreshedEvent для приложения без Boot Spring.

...