Tomcat启动过程(三):从SocketProcessor到Container

1、Http11Protocol中的内部类Http11ConnectionHandler,执行其process方法

if (processor == null) {
   processor = createProcessor();
  }
SocketState state = processor.process(socket);//交给processor处理

2、上面的processor为Http11NioProcessor类的实例,在其process方法中,会调用适配器adapter进行数据的处理

 adapter.service(request, response);

这里的adapter实际为CoyoteAdapter类型的实例,该adapter的作用就是作为从connector到container的入口来使用的

3、下面是adapter的处理过程,从该适配的connector中获取容器,进入容器的管道处理流程

public void service(org.apache.coyote.Request req,org.apache.coyote.Response res)throws Exception {
  Request request = (Request) req.getNote(ADAPTER_NOTES);
  Response response = (Response) res.getNote(ADAPTER_NOTES);
  // Parse and set Catalina and configuration specific
  // request parameters
  req.getRequestProcessor().setWorkerThreadName(Thread.currentThread().getName());
  if (postParseRequest(req, request, res, response)) {//postParseRequest用来解析request请求
       connector.getContainer().getPipeline().getFirst().invoke(request, response);//这里开始进入容器的处理过程,返回结果为response
    }
  ……
}

4、进入容器container处理后,就要使用到容器的一个重要的结构:管道pipeline。每个容器类组件都有一个pipeline属性,这个属性控制请求的处理过程,在pipeline上可以添加Valve,进而可以控制请求的处理流程。可以将请求想象成水的流动,请求需要在各个组件之间流动,中间经过若干的水管和水阀,等所有的水阀走完,请求也就处理完了,而每个组件都会有一个默认的水阀(以Standard作为类的前缀)来进行请求的处理,如果业务需要的话,可以自定义Valve,将其安装到容器中。

下面是对整个流程的一些图解,可以很形象地用来帮助理解:整个流程的最终目的就是走到Wrapper的地方,找到正确的Servlet,执行对应的过滤器和doService方法,返回response

原文地址:https://www.cnblogs.com/mingziday/p/5274343.html