我有一些用@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并不是一个好的决定。

最佳答案

您不能在@PostConstruct中进行此操作-在应用程序上下文生命周期中为时尚早。

实施SmartLifecyle将阶段设置为Integer.MAX_VALUE并以start()方法启动容器。

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

10-07 13:43