有序启动和等待容器

时间:2019-04-04 11:39:33

标签: junit apache-kafka apache-kafka-connect testcontainers

在测试中,我有两个使用git commit -m"<message>"和Junit5的容器,分别是git push@Testcontainers

Kafka

执行测试时,我发现一个错误,因为KafkaConnect中的Kafka Connect服务未正确启动(映射的端口8083未监听)。这是因为@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之前启动,并且在kafkaConnect执行期间到达kafka url时,由于kafka:9092尚未运行,因此未获得响应。 然后,我尝试暂停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以便使用manage手动管理其生命周期,因此我在测试用例中添加了显式开始,请参见下文

@Container

这确保kafkaConnect之后@Test test() { kafkaConnect.start(); ... } 开始。但是,我没有找到一种解决方案来通过策略,策略或类似方法在容器定义期间定义顺序,以增加容器之间的依赖关系并避免强制性和手动的生命周期管理。

有可能吗?

1 个答案:

答案 0 :(得分:0)

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);