uf123 发表于 2017-1-23 11:05:00

学习tomcat 小记(1)

1)org.apache.catalina.connector.http.HttpConnector
实现了org.apache.catalina.Connector接口,java.lang.Runnable接口(确保在自己的线程中运行)和org.apache.catalina.Lifecycle接口。Lifecycle接口用于维护每个实现了该接口的tomcat的组件的生命周期。

HttpConnector的initialize方法会调用一个私有方法open,返回一个java.net.ServerSocket实例,赋值给成员变量serverSocket。这里并没有直接调用ServerSocket的构造方法,而是用过open方法调用ServerSocket的一个工厂方法来实现。

2)org.apache.catalina.Connector接口
该接口有很多方法,最重要的是getContainer,setContainer,createRequest和createResponse。

3)HttpProcessor
在tomcat的默认connector中,使用了一个HttpProcessor的对象池, 其中的每个对象都在其自己的线程中使用。因此,connector可同时处理多个http请求。
HttpConnector维护了一个HttpProcessor的对象池,避免了频繁的创建HttpProcessor对象。该对象池使用java.io.Stack实现。
在HttpConnector中,创建的HttpProcessor数目由两个变量决定:minProcessors和maxProcessors。
在tomcat的默认连接器中,HttpProcessor实现了java.lang.Runnable接口,每个HttpProcessor的实例都可以在其自己的线程中运行,成为“处理器线程”(“processor thread”)。HttpConnector创建每个HttpProcessor实例时,都会调用其start方法,启动其处理器线程。

4)HttpConnector类实现了java.lang.Runnable接口,这样它可以专注于自己的线程。启动应用程序时,会创建一个HttpConnector对象,其run方法会被调用。其run方法中是一个循环体,执行以下三件事:
等待http请求;
为每个请求创建一个HttpPorcessor对象;
调用HttpProcessor对象的process方法。

HttpProcessor类的process方法从http请求中获取socket。对每个http请求,它要做一下三件事:
创建一个HttpRequest对象和一个HttpResponse对象;
处理请求行(request line)和请求头(request headers),填充HttpRequest对象;
将HttpRequest对象和HttpResponse对象传给ServletProcessor或StaticResourceProcessor的process方法。


5)HttpProcessor类的process方法
process方法做了三件事,解析连接,解析请求,解析请求头
parseConnection,parseRequest和parseHeaders

HttpProcessor对象负责创建HttpRequest对象,并填充它的成员变量。在其parse方法中,将请求行(request line)和请求头(request header)信息填充到HttpRequest对象中,但并不会填充请求体(request body)和查询字符串(query string)。
页: [1]
查看完整版本: 学习tomcat 小记(1)