Tomcat 学习进阶历程之关闭钩子

使用JAVA的过程中,经常遇到程序启动时初始化一下资源,或生成一下临时文件,程序退出时要清除这些临时文件,或者程序退出时执行一下必要的其他操作。如果程序是通过我们提供的关闭/退出按钮正常退出的,一切还都好处理,但是如果用户直接关闭虚拟机运行的窗口,那一切就会变的比较复杂。

好在java提供了一种优雅的方式去解决这种问题。使得关闭的善后处理的代码能执行。java的关闭钩子能确保总是执行,无论用户如何终止应用程序。除非用户kill,这个是个死穴。

对java而言,虚拟机会对以下几种操作进行关闭:

(1)系统调用System.exit()方法

(2)程序最后一个守护线程退出时,应用程序正常退出。

(3)用户强行中断程序运行,比如ctrl+c等其他方式中断java程序

关闭钩子的生成:

1.创建Thread的子类

2.实现run方法,应用程序关闭时会调用该方法,不需要调用start方法

3.在应用中实例化关闭钩子类

4.使用Runtime注册关闭钩子

下面是一个使用关闭钩子的例子:

public class ShutDownHook extends Thread{
public static void main(String[] args){
Runtime.getRuntime().addShutdownHook(new ShutDownHook());
for(int i=0;i<10;i++){
System.out.println("i="+i);
if(i==4){
System.exit(0);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void run(){
System.out.println("hook shutdown!");
}
}

使用Runtime.getRuntime().addShutdownHook方法注册钩子后,程序在非正常关闭是会执行钩子程序run方法中的相关代码。

Tomcat中的关闭钩子:

在Tomcat的Catalina类中有一个钩子内部类的定义:

protected class CatalinaShutdownHook extends Thread {
        public void run() {
            try {
                if (getServer() != null) {
                    Catalina.this.stop();
                }
            } catch (Throwable ex) {
                log.error(sm.getString("catalina.shutdownHookFail"), ex);
            } finally {
                // If JULI is used, shut JULI down *after* the server shuts down
                // so log messages aren't lost
                LogManager logManager = LogManager.getLogManager();
                if (logManager instanceof ClassLoaderLogManager) {
                    ((ClassLoaderLogManager) logManager).shutdown();
                }
            }
        }
    }

钩子程序因为是Catalina的内部类,所以它可以调用Catalina类中的相关方法。其调用了stop方法用于关闭相关服务组件。

在Catalina的start方法中将钩子进行了注册:

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

我们知道Tomcat启动时Catalina的Start方法会被调用,所以钩子在tomcat启动时就会被注册到虚拟机。

Tomcat 学习进阶历程之关闭钩子

时间: 2024-12-19 18:54:23

Tomcat 学习进阶历程之关闭钩子的相关文章

Tomcat 学习进阶历程之Tomcat架构与核心类分析

前面的http及socket两部分内容,主要是为了后面看Tomcat源码而学习的一些网络基础.从这章开始,就开始实际深入到Tomcat的'内在'去看一看. 在分析Tomcat的源码之前,准备先看一下Tomcat的架构与一些核心类的简单分析,并简单介绍一下Tomcat是如何处理一次Http请求的.这部分内容有相当一部分来源于网络,在此,感谢原作者的贡献. Tomcat的总体架构 Tomcat的架构关系可以从Tomcat的配置文件server.xml中看到端倪. 从上图中可以看出Tomcat 的心脏

Tomcat 学习进阶历程之Tomcat启动过程分析

本节通过跟踪Tomcat的源码来分析Tomcat是如何启动及装配各个组件的.最好下载Tomcat的源码导入到Eclipse,这样方便跟踪.方法可参考: http://www.cnblogs.com/huangfox/archive/2011/10/20/2218970.html 在Tomcat的启动脚本篇,我们分析过,当执行Start.bat文件时,最后实际调用的是BootStrap.java类.如下图: 如上图,实际调用BootStrap,并传递一个名为'start'参数. 在BootStra

关闭钩子

在很多实际应用环境中,当用户关了应用程序时,需要做一些善后清理工作,但问题是,用户有时并不会按照推荐的方法关闭应用程序,很有可能不做清理工作,例如在Tomcat的部署应用中,通过实例化一个Server对象来启动servlet容器,并调用其start方法,然后逐个调用组件的start方法,正常情况下,为了让Server对象能够关闭这些已经启动的组件,你应该向指定的端口发送关闭命令,如果你只是简单的突然退出,例如在应用程序过程中关闭控制台,可能会发生一些意想不到的事情. 幸运的是,java为程序员提

Tomcat 关闭钩子

使用JAVA的过程中,经常遇到程序启动时初始化一下资源,或生成一下临时文件,程序退出时要清除这些临时文件,或者程序退出时执行一下必要的其他操作.如果程序是通过我们提供的关闭/退出按钮正常退出的,一切还都好处理,但是如果用户直接关闭虚拟机运行的窗口,那一切就会变的比较复杂. 好在java提供了一种优雅的方式去解决这种问题.使得关闭的善后处理的代码能执行.java的关闭钩子能确保总是执行,无论用户如何终止应用程序.除非用户kill,这个是个死穴. 对java而言,虚拟机会对以下几种操作进行关闭: (

tomat(16)关闭钩子

[0]REAMDE 0)本文部分文字描述转自:"how tomcat works",旨在学习"tomat(16)关闭钩子"的相关知识: 1)problem+solution: 1.1)problem:在很多实际环境中,当用户关闭应用程序时,并不会按照推荐的方法关闭应用程序,很有可能不做清理工作: 1.2)solution:java 为程序员提供了一种优雅的方法可以在在关闭过程中执行一些代码,以确保那些负责善后处理的代码可能能够执行: 2)在java中,虚拟机会对两类

Tomcat学习之二:tomcat安装、配置及目录文件说明

我们看到tomcat目录/bin文件夹里有个tomcat6w.exe,顾名思义就是tomcat以window方式显示控制台.第1次点击打开它时候,可能会提示:tomcat指定的服务未安装,此时我们可以这样解决它. 打开命令行提示符窗口-> 进入Tomcat安装目录-> 进入bin目录下-> 输入:service.bat install 即可,如图操作,tomcat目录按自己电脑上的来即可 <!--[endif]--> 这样就可以让tomcat以window方式显示控制台.点击

Tomcat学习总结(8)——Tomcat+Nginx集群解决均衡负载及生产环境热部署

近日,为解决生产环境热部署问题,决定在服务器中增加一个tomcat组成集群,利用集群解决热部署问题. 这样既能解决高并发瓶颈问题,又能解决热部署(不影响用户使用的情况下平滑更新生产服务器)问题. 因为项目是前后端分离的,所以本以为成本很低,没想到遇到了一系列的坑,解决了2天才搞定,发现了很多不是集群而是项目本身的问题. 我是同一个服务器下配置tomcat和nginx等,本文主要面向有一定基础的读者,基本配置就不在本文累述了(基础问题可以留言或者发邮件). 0x0_1 服务器环境 服务器: Cen

tomcat基础进阶

tomcat基础进阶 大纲 前言 Tomcat Architecture Tomcat Installation Tomcat basic configuration 如何进入Tomcat manager页面? 配置Virtual_Host 总结 前言 我们在前面的博客中介绍以及实现的web架构都是基于"世界上最好的语言"PHP实现动态web站点, 事实上在当今的web服务器端还经常python,perl,Java Script等编程语言实现动态的web站点, 我们今天就介绍一款实现著

Tomcat学习之ClassLoader

Tomcat学习之ClassLoader 2012-09-04 22:19 8993人阅读 评论(4) 收藏 举报  分类: WEB服务器(13)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 类装载器 JDK中提供了3种不同的类加载器:启动类装载器,扩展类装载器和系统类装载器.引导类装载器,用于引导启动Java虚拟机,当执行一个JAVA程序时,就会启动引导类装载器,它是使用本地代码来实现的,会装载%JAVA_HOME%\\jre\lib\rt.jar,它是所有类装载