Заказал запуск и ожидание контейнеров - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть два контейнера в моих тестах с использованием @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.Однако я не нашел решения для определения порядка во время определения контейнера с помощью стратегий, политик или чего-то подобного, чтобы добавить зависимости между контейнерами и избежать обязательного и ручного управления жизненным циклом.

возможно ли это?

...