junit命令启动和等待容器

dluptydi  于 2021-06-06  发布在  Kafka
关注(0)|答案(1)|浏览(499)

我有两个容器在我的测试中使用 @Testcontainers 与junit5,a 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 未正确启动(Map端口8083未侦听)。是因为 kafkaConnect 在之前启动 kafkakafka:9092 访问期间到达url kafkaConnect 执行没有得到响应,因为 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` 声明以使用手动管理其生命周期,因此我添加了显式的starting to testcase,如下所示

@Test
test() {
kafkaConnect.start();
...
}

这确保了 `kafkaConnect` 在之后启动 `kafka` . 但是,我没有找到在容器定义期间通过策略、策略或类似的方法来定义顺序的解决方案,以便在容器之间添加依赖关系,并避免强制和手动的生命周期管理。
有可能吗?
zsohkypk

zsohkypk1#

import org.junit.rules.RuleChain;

// @Container <-- Remove annotation.
private final KafkaContainer kafka = new KafkaContainer()...;

// @Container <-- Remove annotation.
private final GenericContainer kafkaConnect = 
        new GenericContainer("confluentinc/cp-kafka-connect:latest")
        .withEnv("CONNECT_BOOTSTRAP_SERVERS", "kafka:9092")
        ...;

// Start the containers in the correct order.  Prevents
// "Mapped port can only be obtained after the container is started"
// error.
@Rule
public final RuleChain chain = 
    RuleChain
    // Started first.
    .outerRule(kafka)
    // Started later.
    .around(kafkaConnect);

相关问题