zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C#操作指针
    C#使用指针表达式
    C#指针转换
    C#基础指针类型
    线性规划中的单纯形法与内点法(原理、步骤以及matlab实现)(二)
    线性规划中的单纯形法与内点法(原理、步骤以及matlab实现)(一)
    201521123079 《Java程序设计》第1周学习总结
    201521123069 《Java程序设计》 第2周学习总结
    201521123069 《Java程序设计》第1周学习总结
    201521123004 《Java程序设计》第2周学习总结
  • 原文地址:https://www.cnblogs.com/mingziday/p/5274343.html
Copyright © 2011-2022 走看看