先看Tomcat的图示结构
1.Server---------Tomcat的最顶层的容器,Server中至少包含一个Service
2.Service--------Service主要包含Connector(可以多个,如同时提供http和https连接)和Container(一个)
3.Connector----主要用于处理连接相关的事,并提供Socket与Request,Response的转换,
4.Container----主要封装和管理Servlet,以及具体处理request请求
Server和Service的启动
总的流程图:
1.Tomcat中的Server是由org.apache.catalina.startup.Catalina来管理的,Catania是整个Tomcat的管理类,包含几个方法load、start、stop,await,用来管理整个服务器的生命周期。
1.1 load方法根据conf/server.xml文件创建Server并调用Server的init方法进行初始化
1.2 start方法用于启动服务器
1.3 stop方法用于停止服务器
1.4 await 方法直接调用Server的await方法,这个方法的作用是进入一个循环,让主线程不会退出
说明:这几个方法都是逐层调用的,这样整个服务器就启动了,start,init和stop是一样的。例:
Server 的Start方法会调用Service中的Start方法
Service中的Start方法又会调用包含Connectors和Container的start方法。
2.Tomcat的入口main方法
这个方法定义在org.apache.catalina.startup.Bootstrap中,Bootstrap的作用类似于CatalinaAdaptor,具体处理过程还是使用Catalina来完成。主要调用了三个方法(这三个方法又是调用的Catalina中的方法)
daemon.setAwait(true); //表示用于设置Server启动完成后是否进入等待的标志
daemon.load(args); //表示加载配置文件,创建并初始化Server
daemon.start(); //用于启动服务器
public static void main(String[] args) {
if (daemon == null) {
Bootstrap bootstrap = new Bootstrap();
try {
bootstrap.init();
} catch (Throwable var3) {
handleThrowable(var3);
var3.printStackTrace();
return;
}
daemon = bootstrap;
} else {
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 var4) {
Throwable t = var4;
if (var4 instanceof InvocationTargetException && var4.getCause() != null) {
t = var4.getCause();
}
handleThrowable(t);
t.printStackTrace();
System.exit(1);
}
}
3.Server的启动过程
Server中的init方法和Start方法分别循环调用了每个Service中的init方法和Start方法,Server的默认实现是org.apache.catalina.core.StandardServer类,它的结构图如下:
解析:上面的LifecycleBase中就定义了init和start方法,并且LifecycleBase里面的init方法和Start方法有调用了initInternal和startInternal方法,而StandardServer中的initInternal和startInternal方法有分别循环调用了service中的start和inti方法,并且StandardServer还实现了await方法,Catalina就是调用它让服务器进入等待状态的。
4.Service的启动过程
Service的默认实现是org.apache.catalina.core.StandardService类,结构图如下:
解析:StandardService中的initInternal和startInternal方法主要调用了container,executors,mapperListener,connectors的init和start方法。
mapperListener这里是Mapper的监听器,可以监听container容器的变化,
executor是用在connectors中管理线程的线程池,在 server.xml配置文件中有参考用法。
如部分:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />