Tomcat源码分析 ----- Tomcat 启动过程
在上一篇文章中,我们已经分析了Tomcat启动的前半部分,包括初始化和配置阶段。这一篇文章我们将继续分析Tomcat的启动过程,包括服务的创建和监听端口的绑定。
在上一篇文章的init
方法中,我们看到了init
方法最后调用了start
方法。在start
方法中,Tomcat会创建并启动各种服务,包括Catalina的Servlet容器和Connector,它们分别负责处理请求和响应。
public void start() throws LifecycleException {
if (getServer() == null) {
// ...
}
// 标记Server已经启动
server.setAwait(true);
// 启动Server
server.start();
// 如果Server不是等待模式,则直接返回
if (!server.getAwait()) {
return;
}
// 创建并启动ShutdownHook线程,用于监听关闭命令
// ...
// 在等待模式下等待关闭命令
// ...
}
在Server
的start
方法中,会创建并启动Service
,而Service
会包含一个或多个Connector
和一个Container
。
public void start() throws LifecycleException {
// 标记Service状态为启动中
setState(LifecycleState.STARTING);
// 启动所有的Connector
for (Connector connector : findServices()) {
try {
connector.start();
} catch (Exception e) {
// ...
}
}
// 启动Container
if (container != null) {
container.start();
}
// ...
// 标记Service状态为已启动
setState(LifecycleState.STARTED);
}
在Connector
的start
方法中,会创建并启动ACCEPTOR线程,这个线程会监听网络端口,一旦有请求到达,就会处理请求。
public void start() throws Exception {
// 标记Connector状态为启动中
setState(LifecycleState.STARTING);
// 初始化并绑定端口
initializeConnection();
// 启动Poller线程,负责连接管理和请求处理
poller.start();
// 启动Acceptor线程,负责接受新的连接
acceptor.start();
// ...
// 标记Connector状态为已启动
setState(LifecycleState.STARTED);
}
在Acceptor
的start
方法中,会创建一个新的线程,并在这个线程中运行run
方法,监听并接受新的连接。
public void start() throws Exception {
// 如果Acceptor已经启动,则直接返回
if (running) {
return;
}
// 标记Acceptor状态为启动中
running = true;
paused = false;
// 创建并启动一个新的线程,执行Acceptor的处理逻辑
thread = new Thread(new Acceptor(), getName());
thread.setPriority(threadPriority);
thread.setDaemon(true);
thread.start();
}
至此,Tomcat的启动过程已经分析完毕。在接下来的文章中,我们将分析Tomcat是如何处理接收到的连接和请求的。
评论已关闭