【问题标题】:How to start Kafka listener manually?如何手动启动 Kafka 监听器?
【发布时间】:2020-04-27 06:40:42
【问题描述】:

我有一些用@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 方法被调用的那一刻还为时过早,听众还没有注册。 我尝试用@Scheduled(fixedDelay = 100) 注释startConsumers() 方法,并且监听器已经可用。但是对于我想在启动应用程序后调用一次的东西,使用@Scheduled 并不是一个好的决定。

【问题讨论】:

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


    【解决方案1】:

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

    实现SmartLifecyle,将阶段设置为Integer.MAX_VALUE,并在start()方法中启动容器。

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

    【讨论】:

    • @EventListener public void onAppStarted(ApplicationStartedEvent event) {} 正是我想要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2015-05-27
    • 2017-06-24
    • 2018-02-18
    • 2011-06-14
    • 2018-03-06
    相关资源
    最近更新 更多