tomcat关闭钩子
转 http://501565246-qq-com.iteye.com/blog/1733575
在很多环境下,在关闭应用程序的时候需要做一些清理工作。问题在于,用户并不是经常的按照要求的流程来退出
Java提供了一种优雅的方式供程序员来使用,这样可以保证清理代码的执行。
使用一个关闭钩子(shutdown hool)来保证清理代码一定会被执行。
在Java中,虚拟机遇到两种事件的时候会关闭虚拟机:
· 应用程序正常退出如System.exit方法被调用或者最后一个非守护退出。
· 用户突然强制终止虚拟机,例如键入CTRL+C或者在关闭Java程序之前从系统注销。
当关闭的时候,虚拟机会有以下两个步骤:
1. 虚拟机启动所有注册的关闭钩子。关闭钩子是实现在Runtime上面注册的线程。所有的关闭钩子会被同时执行直到完成。
2. 虚拟机调用所有的未被调用的finalizers
一个关闭钩子是java.lang.Thread类的子类,可以如下创建一个关闭钩子:
· 写一个类继承Thread类
· 提供你的实现类中的run方法。该方法是应用程序被关闭的时候要提交的代码,无论是正常退出还是非正常退出。
· 在你的应用程序中,初始化一个关闭钩子
· 在当前的Runtime上使用addShutdownHook方法来注册该关闭钩子。
例子
一个简单的类名为ShutdownHookDemo以及一个Thread类的子类名为ShutdownHook类。
注意其run方法仅仅会打印出一些语句在控制台上,但是,你可以在其中插入任何你想要执行的语句。
- public class ShutdownHookDemo {
- public void start() {
- System.out.println("Demo");
- ShutdownHook ShutdownHook = new ShutdownHook();
- Runtime.getRuntime().addShutdownHook(ShutdownHook);
- }
- public static void main(String[] args) {
- ShutdownHookDemo demo = new ShutdownHookDemo();
- demo.start();
- try {
- System.in.read();
- } catch (Exception e) {
- }
- }
- }
- class ShutdownHook extends Thread {
- public void run() {
- System.out.println("Shutting down");
- }
- }
在初始化一个ShutdownHookDemo对象之后,主方法调用start方法。
Start方法创建一个关闭钩子并在当前Runtime中注册。
ShutdownHook ShutdownHook = new ShutdownHook();
Runtime.getRuntime().addShutdownHook(ShutdownHook);
Tomcat中的关闭钩子
在org.apache.catalina.startup.Catalina类中找到它,该类负责启动服务器对象以管理其它组件。
在该类中有一个内部类CatalinaShutdownHook继承了java.lang.Thread类,
在该类的run方法中调用了服务器的stop方法
- protected class CatalinaShutdownHook extends Thread {
- public void run() {
- if (server != null) {
- try {
- ((Lifecycle) server).stop();
- } catch (LifecycleException e) {
- System.out.println("Catalina.stop: " + e);
- e.printStackTrace(System.out);
- if (e.getThrowable() != null) {
- System.out.println("----- Root Cause -----");
- e.getThrowable().printStackTrace(System.out);
- }
- }
- }
- }
- }
该关闭钩子在Catalina实例启动的时候被初始化并添加到Runtime中。
tomcat关闭钩子的更多相关文章
- 关闭钩子(shutdown hook)的作用以及在Tomcat中的使用
在很多实际应用环境中,当用户关了应用程序时,需要做一些善后清理工作,但问题是,用户有时并不会按照推荐的方法关闭应用程序,很有可能不做清理工作,例如在Tomcat的部署应用中,通过实例化一个Server ...
- JAVA关闭钩子
JAVA的关闭钩子: 1. 一般应用程序在关闭时都需要做一些善后清理工作,但是用户并不会总是按照推荐的方法关闭应用程序,比如用户直接关闭控制台程序或者按下Ctrl+C结束应用程序,这样就导致清理工作得 ...
- java的关闭钩子(Shutdown Hook)
Runtime.getRuntime().addShutdownHook(shutdownHook); 这个方法的含义说明: 这个方法的意思就是在jvm中增加一个关闭的钩子,当jv ...
- JVM 关闭钩子
1.功能 在jvm中添加关闭钩子(Runtime.getRuntime().addShutdownHook(shutdownHook);)后,当jvm关闭时会执行系统中已经设置的所有通过该方法添加的钩 ...
- 关闭钩子(shutdown hook)的作用
DK1.3介绍了java.lang.Runtime class的addShutdownHook()方法.如果你需要在你的程序关闭前采取什么措施,那么关闭钩子(shutdown hook)是很有用的. ...
- java 关闭钩子函数的应用
Runtime.getRuntime().addShutdownHook(shutdownHook); 说明:这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的 ...
- Spark学习:ShutdownHookManager虚拟机关闭钩子管理器
Java程序经常也会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码. JAVA中的ShutdownHook提供了比较好的方案. JDK提供了Jav ...
- JAVA虚拟机关闭钩子(Shutdown Hook)
程序经常也会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码.JAVA中的ShutdownHook提供了比较好的方案. JDK提供了Java.Run ...
- tomcat关闭后线程依然运行解决办法
tomcat关闭后线程依然运行解决办法,设置线程为守护线程 守护线程与非守护线程 最近在看多线程的Timer章节,发现运用到了守护线程,感觉Java的基础知识还是需要补充. Java分为两种线程:用户 ...
随机推荐
- oracle 查看 job 日志
select * from user_scheduler_job_log select * from user_scheduler_job_run_details select * from use ...
- JSF 与 struts2
http://suhuanzheng7784877.iteye.com/blog/1041411
- JS高级学习历程-5
[闭包] 定义:闭包就是一个函数 条件:一个函数去嵌套另外一个函数,里边的函数就是闭包 function f1(){ function f2(){ } } 特点:闭包函数有权访问父级环境的变量信息.
- sonar扫描android项目配置 mac版
一. 下载安装 JDK8以上 SonarQube SonarQube Scanner 1. 解压缩SonarQube和SonarQube Scanner,直接运行SonarQube中bin目录下 ...
- Codeforces 161E(搜索)
要点 标签是dp但搜索一发就能过了. 因为是对称矩阵所以试填一下就是一个外层都填满了,因此搜索的深度其实不超过5. 显然要预处理有哪些素数.在这个过程中可以顺便再处理出一个\(vector:re[le ...
- Java EE学习笔记(十)
MyBatis与Spring的整合 1.整合环境搭建 1).要实现MyBatis与Spring的整合,很明显需要这两个框架的JAR包,但是只使用这两个框架中所提供的JAR包是不够的,还需要其他的JAR ...
- 我的grunt配置
module.exports = function(grunt) { // 配置. grunt.initConfig({ pkg: grunt.file.readJSON('package.json' ...
- (转) Linux命令详解-date
Linux命令详解-date 原文:https://www.cnblogs.com/Dodge/p/4278292.html 在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到 ...
- openstack安装newton版本dashboard+cinder(六)
一.dashboard 1.安装dashboard及配置 [root@linux-node1 ~]# yum install openstack-dashboard -y #可以装任何地方只要能连接 ...
- Sql server 查询指定时间区间工作日数、休息日数等日期操作
1.查询指定时间区间的工作日 这个主要难点是法定节假日,国家的法定节假日每年都不一样,还涉及到调休,所以我们设计一个假日表.主要字段有年份,类型(是否调休),假期日期.如下: CREATE TABLE ...