Kafka Stream:优雅关闭

Ram*_*man 3 apache-kafka apache-kafka-streams

如果我们在后台启动 KafkaStream 应用程序(例如 Linux),是否有办法从外部向应用程序发出信号,以启动正常关闭?

Mat*_*Sax 7

正如文档(https://kafka.apache.org/11/documentation/streams/tutorial)中所述,建议注册一个调用KafkaStreams#close()干净关闭的关闭钩子:

final CountDownLatch latch = new CountDownLatch(1);

// attach shutdown handler to catch control-c
Runtime.getRuntime().addShutdownHook(new Thread("streams-shutdown-hook") {
    @Override
    public void run() {
        streams.close();
        latch.countDown();
    }
});

try {
    streams.start();
    latch.await();
} catch (Throwable e) {
    System.exit(1);
}
System.exit(0);
Run Code Online (Sandbox Code Playgroud)

  • `Ctrl-C` 发送一个 `SIGINT` 信号,普通的 `kill <pid>` 发送一个 `SIGTERM` 信号。这些信号由关闭挂钩覆盖(请参阅 https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html 和 /sf/answers/177913291/) 。未涵盖的是来自“kill -9 <pid>”的“SIGKILL”。我建议阅读 Java 文档——这并不是特定于 Kafka 的 Streams API。 (2认同)