我有一些用@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
并不是一个好的决定。
答案 0 :(得分:3)
您无法在@PostConstruct
中做到这一点-在应用程序上下文生命周期中为时尚早。
实施SmartLifecyle
将阶段设置为Integer.MAX_VALUE
,然后使用start()
方法启动容器。
或者使用@EventListener
并监听ApplicationStartedEvent
(如果使用Spring Boot的话)或ContextRefreshedEvent
来监听非Boot Spring应用程序。