Kafka Stream: 优雅关闭

3
如果我们在后台启动KafkaStream应用程序(例如Linux),是否有一种方法可以从外部向应用程序发出信号,以启动优雅的关闭?
1个回答

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

如果应用程序作为后台进程启动,则我认为控制-C可能不适用。我们可以使用PID终止流应用程序实例,但不确定上述操作是否会启用干净的关闭。请确认。 - Raman
2
Ctrl-C 发送一个 SIGINT 信号,而正常的 kill <pid> 发送一个 SIGTERM 信号。这些信号都被关机钩子所覆盖(请参阅 https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html 和 https://dev59.com/QnE85IYBdhLWcg3w8IM4#2541618)。没有被覆盖的是来自 kill -9 <pid>SIGKILL。我建议阅读Java文档--这与Kafka的Streams API无关。 - miguno
只有一个追加问题,我们使用的是0.10.1版本,所以仅为关闭挂钩添加一个新线程,是否存在面临与以下链接中列出的相同问题的可能性?https://dev59.com/ep_ha4cB1Zd3GeqPx2b- - Raman
这不应该是一个问题。报告的多线程问题只影响内部的 StreamThreads - Matthias J. Sax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接