При обновлении проекта с 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
На наших сборочных машинах не работает Kafka локально, а тесты, использующие EmbeddedKafkaBroker
, делают это с пользовательским расширением JUnit5, котороеостанавливает / запускает прослушиватели контейнеров между тестами (при поиске всех разделов и тем до последних, чтобы предотвратить случайную утечку тестов сообщениями, чтобы сломать ожидания в последующих тестах).Хотя он намного быстрее, чем @DirtiesContext
, он не внедряется в контекст во время настройки, как это делает аннотация @EmbddedKafka
.
В предыдущей версии это не было проблемой;Мы увидели бы некоторые сообщения журнала о невозможности подключения, пока расширение настроило и запустило посредник, но тогда все было в порядке.
В новой версии контекст не запускается полностью (пользовательское расширение даже не получаетшанс побежать).Глядя на свойства, единственная настройка, которую я вижу при сбое запуска, это spring.kafka.admin.fail-fast
, но по умолчанию это FALSE, и мы его не меняем.
Сравнивая его с запуском самого проекта в виде приложения Springboot, первое отличие, которое я вижу, состоит в том, что контейнеры запускаются в своих собственных потоках при запуске в качестве приложения, но в потоке main
/ Test Worker
, когдазапустить в качестве теста.В предыдущей версии тесты также запускали контейнеры в своем собственном потоке.
Любое понимание того, почему тесты ведут себя иначе?Или, если есть способ настроить его, чтобы отключить их от основного потока?