如果启动时没有可用的代理,Spring Integration Kafka 3.0.1 -> 3.1.2 测试现在无法启动

mru*_*nak 4 java spring-boot spring-kafka

在将一个项目从 Springboot 2.0 升级到 2.1 的时候,我们也spring-kafka-integration从 3.0.1升级到了 3.2.1。在这样做时,我们的测试现在都无法启动,原因如下:

org.apache.kafka.clients.NetworkClient   : [Consumer clientId=consumer-1, groupId=x] Connection to node -1 could not be established. Broker may not be available.
org.apache.kafka.clients.NetworkClient   : [Consumer clientId=consumer-1, groupId=x] Connection to node -1 could not be established. Broker may not be available.
org.apache.kafka.clients.NetworkClient   : [Consumer clientId=consumer-1, groupId=x] Connection to node -1 could not be established. Broker may not be available.
...
org.springframework.context.ApplicationContextException: Failed to start bean 'eventInboundFlow.kafka:message-driven-channel-adapter#0'; nested exception is org.apache.kafka.common.errors.TimeoutException: Timeout expired while fetching topic metadata
Run Code Online (Sandbox Code Playgroud)

我们的构建机器没有本地运行的 Kafka,并且测试使用EmbeddedKafkaBroker自定义 JUnit5 扩展来停止/启动测试之间的容器侦听器(同时查找所有分区和主题到最新,以防止测试意外泄漏消息以破坏在以后的测试中的期望)。虽然比 快得多@DirtiesContext,但它不会像@EmbddedKafka注解那样在配置期间将自己注入上下文。

在以前的版本中,这不是问题;我们会看到一些关于在扩展配置和启动代理时无法连接的日志消息,但一切都很好。

在新版本中,上下文无法完全启动(自定义扩展甚至没有机会运行)。查看属性,我可以看到启动失败的唯一设置是spring.kafka.admin.fail-fast,但默认情况下为 FALSE,我们不会更改它。

将其与作为 springboot 应用程序启动项目本身进行比较,我看到的第一个区别是容器在作为应用程序运行时在自己的线程中启动,但作为测试运行时在main/Test Worker线程中启动。在之前的版本中,测试也在自己的线程中启动了容器。

对为什么测试现在表现不同的任何见解?或者是否有办法对其进行配置以使它们脱离主线程?

Gar*_*ell 5

将容器属性设置missingQueuesFatalfalse

请参阅Apacher Kafka 2.2Spring。有什么新鲜事

添加了一个新的容器属性 (missingTopicsFatal)。有关更多信息,请参阅使用 KafkaMessageListenerContainer。

从 2.2 版开始,添加了一个名为 missingTopicsFatal 的新容器属性(默认值:true)。如果代理上不存在任何已配置的主题,这将阻止容器启动。如果容器配置为侦听主题模式(正则表达式),则它不适用。以前,容器线程在 consumer.poll() 方法中循环,等待主题出现,同时记录许多消息。除了日志,没有迹象表明存在问题。要恢复以前的行为,您可以将该属性设置为 false。

将该属性设置为 false 将禁用检查。