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

  • 相关阅读:
    phpexcel 相关知识
    php 相关的设置
    linux md5sum 常用用法
    mysql 修改group_concat的限制(row 20000 was cut by group_concat())
    mysql设置最大连接数 max_connections
    Mysql 需要修改的一些配置
    mysql设置远程访问,解决不能通过ip登录的问题(MySQL Error Number 2003,Can't connect to MySQL server )
    mysql 用户权限管理的粗略认识
    文字图片在wps中清晰化方法
    Linux 如何释放Hugepage 占用的内存
  • 原文地址:https://www.cnblogs.com/mingziday/p/5274343.html
Copyright © 2011-2022 走看看