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分为两种线程:用户 ...
随机推荐
- PJzhang:搜索引擎高级语法与渗透测试
猫宁!!! 参考链接: https://www.freebuf.com/articles/network/169601.html https://www.jianshu.com/p/f8062e2cc ...
- Delphi调用C# 编写dll动态库
Delphi调用C# 编写dll动态库 编写C#dll的方法都一样,首先在vs2005中创建一个“类库”项目WZPayDll, using System.Runtime.InteropServices ...
- nginx 第二课
基本配置格式 Nginx全局配置参数 使用include文件 HTTP的server部分 虚拟服务器部分 location —— where,when,how. mail的server部分. 完整的示 ...
- HTML+CSS注意点
1. 对于中文网页,需要在header中使用<meta charset="utf-8">声明编码,否则会出现乱码. 2. 属性 属性 描述 class 为html元素定 ...
- Python-8-print和import进阶
1.打印多个参数 用逗号隔开: >>> print('Age:', 42) Age: 42 参数之间自动插入了一个空格字符 >>> name = 'Gumby' & ...
- 牛客假日团队赛2 D.亲和数对
链接: https://ac.nowcoder.com/acm/contest/924/D 题意: 求在给定区间[start,end]内所有的亲和数对. 亲和数的定义:对于数对(A,B),如果A的除了 ...
- centos下svnadmin的部署过程
1. 安装SVN #yum –y install subversion 2. 安装openjdk #yum –y list java* #yum –y install java-1.8.0 ...
- c++笔记3
一基本语法: 1.1 字符串:支持标准C的 const char* pch=0/"";//不指向任何对象和指向空字符串.C++提供的string类可提供字符串的所有操作,最好是融合 ...
- Nginx中的Rewrite的重定向配置与实践
阅读目录 一:理解地址重写 与 地址转发的含义. 二:理解 Rewrite指令 使用 三:理解if指令 四:理解防盗链及nginx配置 简介:Rewrite是Nginx服务器提供的一个重要的功能, ...
- JS中比较的数值如何比较大小
<script type="text/javascript"> function check_num(){ var num=document.getElementByI ...