Spring KafkaListener:如何知道何时准备就绪

时间:2019-04-10 17:41:22

标签: spring spring-boot apache-kafka spring-kafka spring-kafka-test

我有一个简单的Spring Boot应用程序,可从Kafka读取并写入Kafka。我使用SpringBootTest编写了EmbeddedKafka来测试所有内容。

主要问题是:有时测试失败,因为测试过早发送了Kafka消息。这样,该消息已经在Spring应用程序(或更确切地说,其KafkaListener)准备就绪之前已被写入Kafka。由于侦听器从latest偏移量中进行读取(我不想更改测试的任何配置-除了bootstrap.servers之外),因此它将不会收到该测试中的所有消息。

有人知道我如何在测试中知道KafkaListener已准备好接收消息吗?

我只能想到的是等待/health可用,但是我不知道是否可以肯定KafkaListener是否已经准备就绪。

非常感谢您的帮助!

最诚挚的问候。

2 个答案:

答案 0 :(得分:2)

如果您有一个KafkaMessageListenerContainer实例,那么使用org.springframework.kafka.test.utils.ContainerTestUtils.waitForAssignment(Object container, int partitions)非常容易。

https://docs.spring.io/spring-kafka/api/org/springframework/kafka/test/utils/ContainerTestUtils.html

例如在测试设置中调用ContainerTestUtils.waitForAssignment(container, 1);将会阻塞,直到容器已分配1个分区为止。

答案 1 :(得分:0)

因此,我刚刚读到@PostConstruct,结果证明您也可以在测试中轻松使用它:

@PostConstruct
public void checkApplicationReady() {
    applicationReady = true;
}

现在,我添加了一个@Before方法,等待该标志设置为true。

到目前为止,这似乎效果很好!