Spring KafkaListener: как узнать, когда он будет готов

У меня есть простое приложение Spring Boot, которое читает из Kafka и пишет в Kafka. Я написал SpringBootTest используя EmbeddedKafka чтобы проверить все это.

Основная проблема: иногда тест не проходит, потому что тест отправляет сообщение Kafka слишком рано. Таким образом, сообщение уже записано в Kafka перед приложением Spring (или его KafkaListener если быть точным) готов. Поскольку слушатель читает из latest смещение (я не хочу изменять какие-либо настройки для моего теста - кроме bootstrap.servers), он не будет получать все сообщения в этом тесте.

Кто-нибудь имеет представление, как я мог узнать в тесте, что KafkaListener готов получать сообщения?

Единственный способ, которым я мог думать, это ждать /health доступно, но я понятия не имею, могу ли я быть уверен, что это подразумевает KafkaListener быть готовым на все.

Любая помощь с благодарностью!

С наилучшими пожеланиями.

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 раздел.

Итак, я только что прочитал о @PostConstruct и оказывается, что вы можете легко использовать это также в тесте:

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

Теперь я добавил @Before метод ожидания, пока этот флаг не будет установлен в true.

Пока что это работает очень хорошо!

Другие вопросы по тегам