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

            

            在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 执行和代码 ---------------------------------