我有一个使用SpringBoot 2.10.0.Release和kafka的应用程序,版本为2.10.0。该应用程序有一个简单的生产者和消费者:发送者使用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
有没有办法实现这一目标,如果可以,有人可以给我提示或关键字来解决这个问题吗?
答案 0 :(得分:0)
使用KafkaListener运行Spring-Boot应用程序时,默认情况下,监听器将尝试监听Kafka。如果KafkaBroker无效或丢失,那么您会得到org.apache.kafka.common.KafkaException
。
您可以通过将autoStartup属性设置为false来更改容器工厂的默认行为。一种方法是在您的KafkaListener批注中添加autoStartup = "false"
元素:
@KafkaListener(topics = "some_topic", autoStartup = "false")
public void fooEventListener(){
现在,您的spring boot应用程序将启动。如果代理仍然关闭或无效,则在尝试使用KafkaListener时仍然会出现错误,但是现在您将能够在Java代码内处理错误,而不会导致Spring Boot服务器崩溃。
Documentation about KafkaListner autoStartup element。
必须提到的是,您收到的错误(TimeoutException)并不是因为代理关闭,而是如果缓冲区已满,Kafka将抛出的错误。 然后,批处理记录将从队列中删除,并且不会传递给代理。该错误将不是您使用Kafka的应用程序无法启动的原因。