如何从storm topology主类调用shutdown钩子?

hi3rlvi2  于 2021-06-21  发布在  Storm
关注(0)|答案(3)|浏览(437)

我有一个风暴拓扑类开始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)上运行它吗。

mwngjboj

mwngjboj1#

据我所知,他们已经实现了一个允许启动shutdown hook的更改,但是hooks代码被限制在一秒钟之内,所以对于某些场景是可以的。hovewer,我没有亲自检查,因为这对我的缓冲区上传来说是不够的。但对我来说,还有另一种方法,我要实施。

eni9jsuy

eni9jsuy2#

几年前,内森·马兹(nathan marz)在评论一个类似的问题时,我认为这种行为没有改变:
https://groups.google.com/forum/#!topic/storm用户/a4-ufs6px2y
storm使用sigkill关闭工作进程,jvm在这些情况下不会执行shutdown钩子(就像sigint那样)。

t1rydlwq

t1rydlwq3#

Runtime#addShutdownHook ,这是可能的。
问题应该是由 Utils.sleep(1000000); . 您不应该“休眠”关闭线程,因为java虚拟机(和其他应用程序)不允许它。shutdown hook被设计为在应用程序即将关闭时调用,以保存重要的内容或卸载资源等。java虚拟机将在几秒钟后终止,即使线程没有完全执行。
在极少数情况下,虚拟机可能会中止,即在未完全关闭的情况下停止运行。当虚拟机在外部终止时会发生这种情况,例如在unix上使用sigkill信号或在microsoft windows上使用terminateprocess调用。如果本机方法出错(例如,损坏内部数据结构或试图访问不存在的内存),虚拟机也可能会中止。如果虚拟机中止,则无法保证是否会运行任何关闭挂钩。
从javadoc获取运行时类。有时不会调用关闭挂钩。祝你好运!

相关问题