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