我有一些用@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
。