• 执行代码[置顶] 初探Tomcat源码 —— 关闭钩子


    工作之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下执行代码

                

                在Tomcat中,通过Catalina的start()来启动服务器Server等组件;然后监听ShutDown命令来调用stop()关闭。

                但是,如果程序没有走上面的流程,非正常关闭,那么stop()的逻辑就没法执行了。荣幸的是,和Java的shutdown钩子一样,Tomcat也供给了自己的关闭钩子。

        JVM的关闭钩子可以参考我的《JVM关闭钩子(2)—— 源码浅析》,主要是Shutdown和ApplicationShutdownHooks两个类。

        

                Tomcat中的关闭钩子--CatalinaShutdownHook,作为一个内部类定义在Catalina中,它继承了Thread,并在run()中调用了Catalina.stop()。

    protected class CatalinaShutdownHook extends Thread {
            public void run() {
                if (server != null) 
                    Catalina.this.stop();
            }
    }

        

        每日一道理
    “上下五千年,龙的看火不灭;古有愚公志,而今从头越…… ”站在新世纪的门槛上,我们的追求就是让祖国灿烂的喜悦飞扬在美好的明天……

                然后在Catalina.start()中,把CatalinaShutdownHook注册到Java的关闭钩子中。实际上Tomcat的关闭钩子就是注册到JVM的关闭钩子中。注册代码如下:

    try {
         if (useShutdownHook) {
            if (shutdownHook == null) 
                shutdownHook = new CatalinaShutdownHook();
            Runtime.getRuntime().addShutdownHook(shutdownHook);
        }
    } catch (Throwable t) { }

          

                另外,在Catalina.stop()中有一段移除关闭钩子的代码,避免重复执行关闭操纵。因为如果能正常关闭服务器的话,就不须要再执行一次关闭钩子了。移除代码如下:

    try {
        if (useShutdownHook) 
            Runtime.getRuntime().removeShutdownHook(shutdownHook);
    } catch (Throwable t) { }

        
            这样,当Tomcat异常关闭,没有执行Catalina.stop(),那么在JVM关闭的时候,就会触发关闭钩子,执行CatalinaShutdownHook.run(),来stop服务器,停止一些退出的清理工作。

        
    ——源代码取自Tomcat 5.0

        

    文章结束给大家分享下程序员的一些笑话语录: 这年头的互联网真是娱乐了中国,网民们从各种各样的“门”里钻来钻去,又有好多“哥”好多“帝”,值得大家品味不已……网络经典语录,关于IT与互联网,经典与您分享!

    --------------------------------- 原创文章 By 执行和代码 ---------------------------------

  • 相关阅读:
    牛客练习赛51 D题
    Educational Codeforces Round 72 (Rated for Div. 2) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Educational Codeforces Round 72 (Rated for Div. 2) B题
    Educational Codeforces Round 72 (Rated for Div. 2) A题
    《DSP using MATLAB》Problem 7.2
    《DSP using MATLAB》Problem 7.1
    《DSP using MATLAB》Problem 6.24
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3095668.html
Copyright © 2020-2023  润新知