如何手动启动Kafka监听器?

时间:2020-01-09 15:52:08

标签: java spring spring-boot apache-kafka spring-kafka

我有一些用@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 个答案:

答案 0 :(得分:3)

您无法在@PostConstruct中做到这一点-在应用程序上下文生命周期中为时尚早。

实施SmartLifecyle将阶段设置为Integer.MAX_VALUE,然后使用start()方法启动容器。

或者使用@EventListener并监听ApplicationStartedEvent(如果使用Spring Boot的话)或ContextRefreshedEvent来监听非Boot Spring应用程序。

相关问题