总体概述
tomcat类有三种工作模式,当tomcat作为“独立的Servlet容器“时,tomcat的启动与停止是通过执行bin目录下的脚本完成的。脚本的入口方法是Bootstrap的main方法。具体的启动与停止都是通过BootStrap反射调用Catalina的实例来实现的。Catalina是tomcat生命期的一个开始类,BootStrap是对Catalina类所封装,提供了main()方法,方便调用。下面我们来研究一下tomcat的启动与停止过程。
tomcat运行可以分为以下三个阶段
1. 启动过程:启动相应的Server,Service,Connector等组件
2. 响应过程:主线程等待接收停止tomcat信号,其它线程接收并请求处理。
3. 结束过程:接收到停止信号后,关闭tomcat
总体分析
先看入口类Bootstrap的定义
//几个重要属性
private static Bootstrap daemon = null;
//Catalina类的实例
private Object catalinaDaemon = null;
//三个重要的ClassLoader
ClassLoader commonLoader = null;
ClassLoader catalinaLoader = null;
ClassLoader sharedLoader = null;
public static void main(String args[]) {
if (daemon == null) {
// Don't set daemon until init() has completed
Bootstrap bootstrap = new Bootstrap();
try {
bootstrap.init();
} catch (Throwable t) {
handleThrowable(t);
t.printStackTrace();
return;
}
daemon = bootstrap;
} else {
// When running as a service the call to stop will be on a new
// thread so make sure the correct class loader is used to prevent
// a range of class not found exceptions。
Thread。currentThread().setContextClassLoader(daemon。catalinaLoader);
}
try {
String command = "start";
if (args.length > 0) {
command = args[args.length - 1];
}
if (command.equals("startd")) {
args[args.length - 1] = "start";
daemon.load(args);
daemon.start();
} else if (command.equals("stopd")) {
args[args.length - 1] = "stop";
daemon。.stop();
} else if (command.equals("start")) {
daemon.setAwait(true);
daemon.load(args);
daemon.start();
} else if (command.equals("stop")) {
daemon.stopServer(args);
} else if (command.equals("configtest")) {
daemon.load(args);
if (null==daemon。getServer()) {
System.exit(1);
}
System.exit(0);
} else {
log.warn("Bootstrap: command \"" + command + "\" does not exist。");
}
} catch (Throwable t) {
// Unwrap the Exception for clearer error reporting
if (t instanceof InvocationTargetException &&
t.getCause() != null) {
t = t.getCause();
}
handleThrowable(t);
t.printStackTrace();
System.exit(1);
}
}
main()
方法中,首先判定daemon
是否为null,每次通过脚本执行main()函数时,一定会是一个新的线程,所以这里的deamon
一定为空,当
daemon为空时,调用
init()方法,该方法的主要功能初始始化相关的
ClassLoader,创建
catalinaDaemon,即``Catalina
实例 ,并且给catalinaDaemon
设置相应的parentClassLoader
,最后将新建的BootStrap
设置给deamon
。
而后处理具体命令及参数,看到主要的几个调用的方法是
daemon.setAwait(true); //设置await
daemon.load(args); //加载配置
daemon.start(); //启动服务
daemon.stop(); // 停止服务
daemon.stopServer(args); //停止server
上面这五个函数的实现分别分通过反射调用catalinaDaemon
的setAwait
,load
,start
,stop
,stopServer
方法。这五个方法就是tomcat启动与停止的核心方法。这五个方法完成了tomcat的启动,主线程等待,tomcat停止的功能,stop
的作用是停止服务,而stopServer
的作用是发送停止命令。
首先来看Catalina类的属性的定义
protected boolean await = false;
protected