如何从风暴拓扑主类调用shutdown hook?

时间:2015-02-04 12:23:58

标签: java apache-storm shutdown-hook

我有一个风暴拓扑类,它启动了kafka喷口和螺栓。这门课是主要课程。我正在尝试清除退出风暴拓扑,所以我在拓扑主方法的一侧创建了一个关闭钩子。

//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 个答案:

答案 0 :(得分:1)

Runtime#addShutdownHook,有可能 问题应该由Utils.sleep(1000000);引起。你不应该睡觉"关闭线程作为Java虚拟机(和其他应用程序)不允许它。关闭钩子设计用于在应用程序即将关闭时调用,以保存重要的东西或卸载资源等。几秒钟后Java虚拟机将终止,即使线程没有完全执行。

  

在极少数情况下,虚拟机可能会中止,即停止运行而不会干净地关闭。当虚拟机在外部终止时会发生这种情况,例如Unix上的SIGKILL信号或Microsoft Windows上的TerminateProcess调用。如果本机方法因例如破坏内部数据结构或尝试访问不存在的内存而出错,则虚拟机也可能中止。如果虚拟机中止,则无法保证是否将运行任何关闭挂钩。

从JavaDoc for Runtime类。有时候不会调用关闭钩子。祝你好运!

答案 1 :(得分:0)

多年前见Nathan Marz对类似问题的评论,我认为这种行为没有改变:

https://groups.google.com/forum/#!topic/storm-user/A4-uFS6px2Y

Storm使用SIGKILL关闭工作进程,JVM在这种情况下不会执行关闭挂钩(就像SIGINT一样)。

答案 2 :(得分:0)

据我所知thisthis,他们实施了一项允许关闭挂钩的更改,但挂钩代码有限一秒钟,某些情况下还可以。 Hovewer,我没有亲自检查,因为我的情况是缓冲上传还不够。但是对于我来说,还有其他approach我将要实施。