Tomcat源码分析(一)--服务启动(四)

2014-11-24 08:39:21 · 作者: · 浏览: 6
面的代码:
[java]
server.initialize();
((Lifecycle) server).start();
既然有了服务器组件的对象,就初始化然后启动就可以了,到此,tomcat就实现了启动服务器组件StandardServer。启动后做的事情就东西比较多,但是还是比较清晰的,StandardServer的start方法关键代码是启动它的子组件StandardService:
[java]
// Start our defined Services
synchronized (services) {
for (int i = 0; i < services.length; i++) {
if (services[i] instanceof Lifecycle)
((Lifecycle) services[i]).start();//调用StandardService的start
}
}

StandardService的start方法跟StandardServer的start方法差不多,是启动它的连接器和容器,上面说了一个Service包含一个容器和多个连接器:
[java]
// Start our defined Container first
if (container != null) {
synchronized (container) {
if (container instanceof Lifecycle) {
((Lifecycle) container).start();//启动容器
}
}
}

// Start our defined Connectors second
synchronized (connectors) {
for (int i = 0; i < connectors.length; i++) {
if (connectors[i] instanceof Lifecycle)
((Lifecycle) connectors[i]).start();//启动连接器
}
}

默认的连接器是HttpConnector,所以会调用HttpConnector的start方法,它的方法如下:
[java]
public void start() throws LifecycleException {

// Validate and update our current state
if (started)
throw new LifecycleException
(sm.getString("httpConnector.alreadyStarted"));
threadName = "HttpConnector[" + port + "]";
lifecycle.fireLifecycleEvent(START_EVENT, null);
started = true;

// Start our background thread
threadStart();//启动一个后台线程,用来处理http请求连接

// Create the specified minimum number of processors
while (curProcessors < minProcessors) {
if ((maxProcessors > 0) && (curProcessors >= maxProcessors))
break;
HttpProcessor processor = newProcessor();//后台处理连接的线程
recycle(processor);
}

}

这里有个两个关键的类:HttpConnector和HttpProcessor,它们都实现了Runnable接口,HttpConnector负责接收http请求,HttpProcessor负责处理由HttpConnector接收到的请求。注意这里HttpProcessor会有很多的实例,最大可以有maxProcessor个,初始化是20个。所以在threadStart方法中会启动一个后台线程来接收http连接,如下:
[java]
private void threadStart() {

log(sm.getString("httpConnector.starting"));

thread = new Thread(this, threadName);
thread.setDaemon(true);
thread.start();

}

这样,就会启动HttpConnector后台线程,它的run方法不断循环,主要就是新建一个ServerSocket来监听端口等待连接,主要代码如下:
[java]
socket = serverSocket.accept();
..........................
..........................
processor.assign(socket);
serverSocket一直等待连接,得到连接后给HttpProcessor的实例processor来处理,serverSocket则继续循环监听,至于processor具体怎么处理,还有很多要说,这里先不说。
至此,tomcat启动完成了,StandardServer启动后,一直到HttpConnector线程等待监听,就可以处理客户端的http请求了。

作者:haitao111313