Shutdown Hook
一、概述
1. JVM会响应关闭自己的两种Event
(1)应用程序调用System.exit方法或最后一个非守护进程non-daemon退出
(2)用户在关java程序之前,突然强制关机,比如CTRL+C或者注销系统
2. JVM为shuttingdown提供了两段式处理流程
(1)JVM会和所有注册过的shutdown hooks一起启动。这些注册的shutdown hooks会在运行时作为线程运行。所有shutdown hooks都会并行执行结束
(2)适当情况下,JVM会调用所有未调用的finalizers
3. Shutdown hook创建步骤:
(1)写Thread类的子类
(2)提供run()方法的实现代码,用于当突然或正常关机时运行
(3)实例化这个shutdownhook类
(4)调用当前runtime的addShutdownHook()方法注册shutdownhook
4. 实例
public class ShutdownHookDemo {
public static void main(String[] args) {
System.out.println("start demo...");
ShutdownHookDemo demo = new ShutdownHookDemo();
demo.start();
// 读取console输入后,正常退出程序,会调用hook.run()
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
private void start() {
ShutdownHook shutdownHook = new ShutdownHook();
Runtime.getRuntime().addShutdownHook(shutdownHook);
}
class ShutdownHook extends Thread{
public void run() {
System.out.println("Running ShutdownHook");
}
}
}
5. Tomcat的CatalinaShutdowHook代码
public class CatalinaShutdownHook extends Thread{
public void run() {
if(server != null) {
((Lifecycle)server).stop();
}
}
}
Tomcat启动
1. 概述
(1)启动类:
Catalina: 用来启动和停止Server对象,同时解析Tomcat的配置文件server.xml
Bootstrap:创建Catalina实例和调用其process方法的接入点。针对不同场景会有多个Bootstrap实现,如Bootstrap类用来启动单机版,BootstrapService用来启动WindowsNT service的tomcat。Tomcat提供了batch/shell脚本文件来启动,无需用户关注使用哪个启动类的细节
2. Catalina类
(1)process()方法
public void process(String args[]) {
setCatalinaHome();
setCatalinaBase();
try {
if (arguments(args))
execute();
} catch (Exception e) {
e.printStackTrace(System.out);
}
}
(2)arguments(args)方法
protected boolean arguments(String args[]) {
boolean isConfig = false;
if (args.length < 1) {
usage();
return (false);
}
for (int i = 0; i < args.length; i++) {
if (isConfig) {