在很多环境下,在关闭应用程序的时候需要做一些清理工作。问题在于,用户并不是经常的按照要求的流程来退出
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中。
分享到:
相关推荐
【WEB服务器工作机制由浅至深(9):【How Tomcat Works】第16章 关闭钩子以及之后的章节简述】 在深入探讨Tomcat服务器的工作机制时,我们来到了第16章,这一章主要讨论了“关闭钩子”(Shutdown Hooks)的概念及其在...
《深入剖析Tomcat(中文版+英文版)》.rar 《深入剖析Tomcat》深入剖析Tomcat 4和Tomcat 5中的每个...第16章 关闭钩子 第17章 启动tomcat 第18章 部署器 第19章 manager应用程序的servlet类 第20章 基于jmx的管理
7. **错误的shutdown钩子**:有时,一个未正确关闭的shutdown钩子可能导致Tomcat在启动时自动关闭。检查`bin/setenv.sh`或`bin/setenv.bat`文件,删除可能导致问题的钩子。 8. **服务注册**:如果在Windows上,尝试...
可能讲解了如何通过修改Tomcat配置文件(如`server.xml`)来设置自定义的关闭钩子,或者介绍了使用系统监控工具(如`top`, `htop`, 或 `glances`)来实时查看Tomcat的资源使用情况。 至于压缩包内的文件`example....
接着,启动Server并注册一个shutdown钩子,确保在接收到系统关闭信号时能正确关闭Tomcat。最后,Catalina会进入监听状态,等待shutdown命令。 `load`方法负责初始化Server实例,包括设置系统属性、初始化命名服务,...
《深入剖析Tomcat》原始码及笔记 -Tomcat的工作原理开发自己的Java Servlet容器的指南 ...第十六章关闭钩子 第十七章启动Tomcat 第十八章部署器 第十九章Manager应用程序的servlet类 第二十章基于JMX的管理
org.apache.catalina.startup.Catalina类的process():创建Digester对象,注册关闭钩子和调用StandardServer 的initialize(),start();然后调用StandardServer的await()多次来等待关闭命令;其本身的start...
1. **Shutdown Hooks**:Java提供了JVM关闭钩子(Shutdown Hooks),允许在JVM退出之前执行清理任务。在Spring Boot中,可以通过实现`DisposableBean`接口或者使用`@PreDestroy`注解的方法来注册这些钩子。当应用...
- 例如,我们可以编写代码在特定条件满足时启动一个新的服务器实例,或者在负载过高时关闭某个实例。 5. **多服务器环境**: - 在分布式系统中,动态引用WebServers技术有助于管理多个服务器实例,比如负载均衡...
这个脚本可以进一步集成到持续集成/持续部署(CI/CD)流程中,例如配合Git的钩子或者Jenkins等自动化工具,每当有新的代码提交,脚本就能自动执行,实现从代码拉取、构建、测试到部署的全过程自动化。 总的来说,...
7. **实际应用**:了解和熟练运用这些Spring钩子和生命周期管理,可以帮助开发者更好地控制服务的初始化和销毁,优化资源利用,提高应用的稳定性和可靠性。 通过“spring-hook-test”项目,你可以深入理解Spring...