`
123003473
  • 浏览: 1059750 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

21,tomcat关闭钩子

 
阅读更多
在很多环境下,在关闭应用程序的时候需要做一些清理工作。问题在于,用户并不是经常的按照要求的流程来退出
Java提供了一种优雅的方式供程序员来使用,这样可以保证清理代码的执行。
使用一个关闭钩子(shutdown hool)来保证清理代码一定会被执行。
在Java中,虚拟机遇到两种事件的时候会关闭虚拟机:
· 应用程序正常退出如System.exit方法被调用或者最后一个非守护退出。
· 用户突然强制终止虚拟机,例如键入CTRL+C或者在关闭Java程序之前从系统注销。
当关闭的时候,虚拟机会有以下两个步骤:
1. 虚拟机启动所有注册的关闭钩子。关闭钩子是实现在Runtime上面注册的线程。所有的关闭钩子会被同时执行直到完成。
2. 虚拟机调用所有的未被调用的finalizers
一个关闭钩子是java.lang.Thread类的子类,可以如下创建一个关闭钩子:
· 写一个类继承Thread类
· 提供你的实现类中的run方法。该方法是应用程序被关闭的时候要提交的代码,无论是正常退出还是非正常退出。
· 在你的应用程序中,初始化一个关闭钩子
· 在当前的Runtime上使用addShutdownHook方法来注册该关闭钩子。
例子
一个简单的类名为ShutdownHookDemo以及一个Thread类的子类名为ShutdownHook类。
注意其run方法仅仅会打印出一些语句在控制台上,但是,你可以在其中插入任何你想要执行的语句。
Java代码  收藏代码
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方法
Java代码  收藏代码
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中。

转载地址:在很多环境下,在关闭应用程序的时候需要做一些清理工作。问题在于,用户并不是经常的按照要求的流程来退出
Java提供了一种优雅的方式供程序员来使用,这样可以保证清理代码的执行。
使用一个关闭钩子(shutdown hool)来保证清理代码一定会被执行。
在Java中,虚拟机遇到两种事件的时候会关闭虚拟机:
· 应用程序正常退出如System.exit方法被调用或者最后一个非守护退出。
· 用户突然强制终止虚拟机,例如键入CTRL+C或者在关闭Java程序之前从系统注销。
当关闭的时候,虚拟机会有以下两个步骤:
1. 虚拟机启动所有注册的关闭钩子。关闭钩子是实现在Runtime上面注册的线程。所有的关闭钩子会被同时执行直到完成。
2. 虚拟机调用所有的未被调用的finalizers
一个关闭钩子是java.lang.Thread类的子类,可以如下创建一个关闭钩子:
· 写一个类继承Thread类
· 提供你的实现类中的run方法。该方法是应用程序被关闭的时候要提交的代码,无论是正常退出还是非正常退出。
· 在你的应用程序中,初始化一个关闭钩子
· 在当前的Runtime上使用addShutdownHook方法来注册该关闭钩子。
例子
一个简单的类名为ShutdownHookDemo以及一个Thread类的子类名为ShutdownHook类。
注意其run方法仅仅会打印出一些语句在控制台上,但是,你可以在其中插入任何你想要执行的语句。
Java代码  收藏代码
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方法
Java代码  收藏代码
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中。

转载地址:http://501565246-qq-com.iteye.com/blog/1733575
分享到:
评论

相关推荐

    WEB服务器工作机制由浅至深(9):【How Tomcat Works】第16章关闭钩子以及之后的章节简述

    【WEB服务器工作机制由浅至深(9):【How Tomcat Works】第16章 关闭钩子以及之后的章节简述】 在深入探讨Tomcat服务器的工作机制时,我们来到了第16章,这一章主要讨论了“关闭钩子”(Shutdown Hooks)的概念及其在...

    64位tomcat一闪而过的解决方法

    7. **错误的shutdown钩子**:有时,一个未正确关闭的shutdown钩子可能导致Tomcat在启动时自动关闭。检查`bin/setenv.sh`或`bin/setenv.bat`文件,删除可能导致问题的钩子。 8. **服务注册**:如果在Windows上,尝试...

    《深入剖析Tomcat(中文版+英文版)》.rar

    《深入剖析Tomcat(中文版+英文版)》.rar 《深入剖析Tomcat》深入剖析Tomcat 4和Tomcat 5中的每个...第16章 关闭钩子 第17章 启动tomcat 第18章 部署器 第19章 manager应用程序的servlet类 第20章 基于jmx的管理

    Shell kill tomcat process

    可能讲解了如何通过修改Tomcat配置文件(如`server.xml`)来设置自定义的关闭钩子,或者介绍了使用系统监控工具(如`top`, `htop`, 或 `glances`)来实时查看Tomcat的资源使用情况。 至于压缩包内的文件`example....

    Tomcat 6 启动过程分析.doc

    接着,启动Server并注册一个shutdown钩子,确保在接收到系统关闭信号时能正确关闭Tomcat。最后,Catalina会进入监听状态,等待shutdown命令。 `load`方法负责初始化Server实例,包括设置系统属性、初始化命名服务,...

    HowTomcatWorks:《深度剖析Tomcat》原始码及笔记

    《深入剖析Tomcat》原始码及笔记 -Tomcat的工作原理开发自己的Java Servlet容器的指南 ...第十六章关闭钩子 第十七章启动Tomcat 第十八章部署器 第十九章Manager应用程序的servlet类 第二十章基于JMX的管理

    myTomcat:WebServer + Tomcat源码分析总结

    org.apache.catalina.startup.Catalina类的process():创建Digester对象,注册关闭钩子和调用StandardServer 的initialize(),start();然后调用StandardServer的await()多次来等待关闭命令;其本身的start...

    graceful-shutdown-spring-boot:使用Spring Boot正常关闭(演示)

    1. **Shutdown Hooks**:Java提供了JVM关闭钩子(Shutdown Hooks),允许在JVM退出之前执行清理任务。在Spring Boot中,可以通过实现`DisposableBean`接口或者使用`@PreDestroy`注解的方法来注册这些钩子。当应用...

    动态引用WebServers操作说明

    - 例如,我们可以编写代码在特定条件满足时启动一个新的服务器实例,或者在负载过高时关闭某个实例。 5. **多服务器环境**: - 在分布式系统中,动态引用WebServers技术有助于管理多个服务器实例,比如负载均衡...

    Linux脚本自动打包发服务

    这个脚本可以进一步集成到持续集成/持续部署(CI/CD)流程中,例如配合Git的钩子或者Jenkins等自动化工具,每当有新的代码提交,脚本就能自动执行,实现从代码拉取、构建、测试到部署的全过程自动化。 总的来说,...

    spring-hook-test.rar

    7. **实际应用**:了解和熟练运用这些Spring钩子和生命周期管理,可以帮助开发者更好地控制服务的初始化和销毁,优化资源利用,提高应用的稳定性和可靠性。 通过“spring-hook-test”项目,你可以深入理解Spring...

    JAVA上百实例源码以及开源项目源代码

    21个目标文件 摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持...

Global site tag (gtag.js) - Google Analytics