应用程序不会因 missingTopicFatal 和手动启动的侦听器而停止

Application is not stopped with missingTopicFatal and manually started listeners

我正在使用 spring 和 spring-kafka。

应用程序启动时,我将压缩的主题加载到内存中,然后当主题被完全读取时,应用程序启动。

为了做到这一点,我创建了 @KafkaListeners,自动启动设置为 false,并创建了一个 SmartLifeCycle bean,AbstractMessageListenerContainer.DEFAULT_PHASE - 1 阶段正在对所有这些侦听器执行 listener.start()(这阅读压缩主题)然后等待它们完成。

这很好用,但如果我设置 spring.kafka.listener.missing-topics-fatal = true 缺少主题,则会出现错误:

org.springframework.context.ApplicationContextException: 启动bean失败'org.springframework.kafka.config.internalKafkaListenerEndpointRegistry';嵌套异常是 java.lang.IllegalStateException:主题 [mytopic] is/are 不存在并且 missingTopicsFatal 是 true

这是预期的行为,但应用程序没有关闭,我手动启动的侦听器保持 运行 并发送错误:

java.lang.IllegalStateException:org.springframework.context.annotation.AnnotationConfigApplicationContext@502e1410还没有刷新

在这种情况下如何退出应用程序?

捕获异常并关闭 JVM:

@SpringBootApplication
public class So60036945Application {

    public static void main(String[] args) {
        try {
            SpringApplication.run(So60036945Application.class, args);
        }
        catch (ApplicationContextException ace) {
            if (ace.getCause() instanceof IllegalStateException) {
                ace.printStackTrace();
                System.exit(1);
            }
        }
    }


    @KafkaListener(id = "so60036945", topics = "so60036945a")
    public void listen(String in) {
        System.out.println(in);
    }

}

但是,正如我在 Gitter 中所说,最好自动启动压缩主题侦听器并手动启动其他侦听器(与您现在正在做的相反)。