应用程序不会因 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 中所说,最好自动启动压缩主题侦听器并手动启动其他侦听器(与您现在正在做的相反)。
我正在使用 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 中所说,最好自动启动压缩主题侦听器并手动启动其他侦听器(与您现在正在做的相反)。