首页 > 解决方案 > 在不检查 Kafka 服务器的情况下启动 Spring Boot 应用程序

问题描述

我有一个在 2.10.0 版本中使用 SpringBoot 2.10.0.Release 和 kafka 的应用程序。该应用程序有一个简单的生产者和消费者:发送者使用 KafkaTemplate,消费者使用 KafkaListener。我试图实现的是即使 KafkaServer 没有运行也能够启动 SpringBoot 应用程序。目前,如果没有运行的 KafkaBroker,应用程序无法启动并出现以下错误消息:

org.springframework.context.ApplicationContextException: 
  Failed to start bean 'org.springframework.kafka.config.internalKafkaListenerEndpointRegistry';
    nested exception is org.apache.kafka.common.errors.TimeoutException

有没有办法实现这一点,如果是的话,有人能给我提示或关键字如何管理吗?

标签: springspring-bootapache-kafka

解决方案


当使用 KafkaListener 运行 Spring-Boot 应用程序时,侦听器将默认尝试侦听 Kafka。如果 KafkaBroker 无效或丢失,那么您将获得一个org.apache.kafka.common.KafkaException.

您可以通过将 autoStartup 属性设置为 false 来更改容器工厂的默认行为。一种方法是向autoStartup = "false"KafkaListener 注释添加元素:

@KafkaListener(topics = "some_topic", autoStartup = "false")
public void fooEventListener(){

现在您的 Spring Boot 应用程序将启动。如果代理仍然关闭或无效,您在尝试使用 KafkaListener 时仍然会收到错误,但您现在可以在 Java 代码中处理错误,而不是 Spring Boot 服务器崩溃。

关于 KafkaListner autoStartup 元素的文档

必须提到的是,您收到的错误(TimeoutException)不是因为代理关闭,如果缓冲区已满,Kafka 会抛出此错误。然后,批次记录将从队列中删除,并且不会传递给代理。此错误不会是您使用 Kafka 的应用程序无法启动的原因。


推荐阅读