У меня есть два контейнера в моих тестах с использованием @Testcontainers
с Junit5, Kafka
и KafkaConnect
.
@Container
private final KafkaContainer kafka = new KafkaContainer()
.withNetwork(network)
.withNetworkAliases("kafka");
@Container
private final GenericContainer KafkaConnect =
new GenericContainer("confluentinc/cp-kafka-connect:latest")
.withEnv("CONNECT_BOOTSTRAP_SERVERS", "kafka:9092")
.withEnv("CONNECT_REST_PORT", 8083)
.withNetwork(network)
...
Когда я выполняю тесты, я нахожу ошибку, потому что служба Kafka Connect в kafkaConnect
не запускается неправильно (подключенный порт 8083 не прослушивает).Это связано с тем, что kafkaConnect
запускается до kafka
, а когда во время выполнения kafkaConnect
достигается URL kafka:9092
, никакого ответа не получено, поскольку kafka
еще не запущен.Затем я попытался отложить запуск kafkaConnect
, чтобы дождаться, пока kafka
обеспечит доступность kafka:9092
.
Я попытался применить другой подход, но я не решил проблему.Я попытался добавить некоторые конфигурации.
startupTimeout
.Насколько я знаю, этот конфиг не откладывает запуск операции.Он просто увеличивает период, чтобы проверить, запущен ли контейнер.
.withStartupTimeout(Duration.of(240, SECONDS))
Я также попробовал некоторые конфигурации для waitingFor
, например, на основе тайм-аута, который, как и ожидалось, дает тот же результат, что и withStartupTimeout
.waitingFor(Wait.defaultWaitStrategy().withStartupTimeout(...))
или на основе порта, что не решает мою проблему, поскольку не указывает на контейнер kafka
, а kafkaConnect
.
.waitingFor(Wait.forHttp("http://kafka:9092"))
Я также пыталсядобавить несколько попыток запуска, но это не решает проблему, потому что kafkaConnect
перезапускается несколько раз, но всегда до kafka
.
В качестве решения я удалил @Container
из kafkaConnect
декларации в порядкечтобы использовать управление своим жизненным циклом вручную, поэтому я добавил явное начало в тестовый сценарий, см. ниже
@Test
test() {
kafkaConnect.start();
...
}
Это обеспечивает запуск kafkaConnect
после kafka
.Однако я не нашел решения для определения порядка во время определения контейнера с помощью стратегий, политик или чего-то подобного, чтобы добавить зависимости между контейнерами и избежать обязательного и ручного управления жизненным циклом.
возможно ли это?