我有一个风暴拓扑类开始Kafka喷口和螺栓。这个班是主班。我正在尝试清理exit storm拓扑,所以我在拓扑main方法的一侧创建了一个shutdown钩子。
//Shutdown hook
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.out.println("Inside shutdown hook.");
Utils.sleep(1000000);
cluster.killTopology("netra-fault-management");
cluster.shutdown();
logger.info("Shutting down Topology.");
}
});
这是我的关机钩子,它是tolpology类的主要方法。我从命令提示符运行它,当我执行ctrl+c时,它应该运行这个关闭钩子,但它只是关闭,没有调用钩子代码。有人知道如何在ctrl+c(sigint)上运行它吗。
3条答案
按热度按时间mwngjboj1#
据我所知,他们已经实现了一个允许启动shutdown hook的更改,但是hooks代码被限制在一秒钟之内,所以对于某些场景是可以的。hovewer,我没有亲自检查,因为这对我的缓冲区上传来说是不够的。但对我来说,还有另一种方法,我要实施。
eni9jsuy2#
几年前,内森·马兹(nathan marz)在评论一个类似的问题时,我认为这种行为没有改变:
https://groups.google.com/forum/#!topic/storm用户/a4-ufs6px2y
storm使用sigkill关闭工作进程,jvm在这些情况下不会执行shutdown钩子(就像sigint那样)。
t1rydlwq3#
与
Runtime#addShutdownHook
,这是可能的。问题应该是由
Utils.sleep(1000000);
. 您不应该“休眠”关闭线程,因为java虚拟机(和其他应用程序)不允许它。shutdown hook被设计为在应用程序即将关闭时调用,以保存重要的内容或卸载资源等。java虚拟机将在几秒钟后终止,即使线程没有完全执行。在极少数情况下,虚拟机可能会中止,即在未完全关闭的情况下停止运行。当虚拟机在外部终止时会发生这种情况,例如在unix上使用sigkill信号或在microsoft windows上使用terminateprocess调用。如果本机方法出错(例如,损坏内部数据结构或试图访问不存在的内存),虚拟机也可能会中止。如果虚拟机中止,则无法保证是否会运行任何关闭挂钩。
从javadoc获取运行时类。有时不会调用关闭挂钩。祝你好运!