2

我在生产和集成测试中都使用了 kafkajs。

在我所有的测试之前,我正在创建一个带有生产者和消费者连接/订阅/运行(eachMeassage)的 kafkajs 实例......在我所有的测试之后,我想优雅地停止我的所有节点进程,包括 kafkajs 组件。

我实际上是这样做的:

export function stopHelper(): Promise<void> {
    return new Promise<void>((resolve, reject) => {
        if (kafkaHelperState === kafkaHelperStateStatus.running) {
            kafkaHelperState = kafkaHelperStateStatus.stopping
            log.debug("stopHelper", kafkaHelperState);
            Promise.all([producer.disconnect, consumer.disconnect])
                .then(() => {
                    kafkaHelperState = kafkaHelperStateStatus.stopped
                    log.info("stopHelper", kafkaHelperState);
                    resolve()
                })
                .catch(error => reject(error))
        } else {
            log.warn("stopHelper", "kafkaHelper is not " + kafkaHelperStateStatus.running)
        }
    })
}

承诺似乎有效。我可以看到我的集成测试套件在生产者和消费者都断开连接的情况下完成。但是我的节点进程仍在运行,没有做任何事情。

在此之前,我使用的是 kafka-node。当我停止消费者时,我的节点进程结束而无需指定任何process.exit(0)

有没有办法优雅地销毁节点进程中的kafkajs实例?

4

1 回答 1

0
Promise.all([producer.disconnect(), consumer.disconnect()])

代替

Promise.all([producer.disconnect, consumer.disconnect])
于 2020-06-19T17:58:25.457 回答