我在使用@Testcontainers
Junit5 的测试中有两个容器,aKafka
和 a 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)
...
当我执行测试时,我发现一个错误,因为kafkaConnect
没有正确启动 Kafka Connect 服务(映射端口 8083 没有监听)。这是因为在执行kafkaConnect
之前启动kafka
并且在执行kafka: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
声明以便手动使用它的生命周期管理,所以我在测试用例中添加了显式开始,见下文
@Test
test() {
kafkaConnect.start();
...
}
此确保kafkaConnect
在kafka
. 但是,我没有找到通过策略、策略或类似的方式在容器定义期间定义顺序的解决方案,以便在容器之间添加依赖关系并避免强制性和手动的生命周期管理。
可能吗?