• tomcat启动(Ⅷ)--请求最终目的地 getContainer().getPipeline().getFirst().invoke(request, response)


    当tomcat的Conector保存着StandardService实例,而StandardService保存着Container的实例

    当Http11NioProcessor.process()方法内调用getAdapter.service(request,response)时会调用CoyoteAdapter.service() 

    上面会调用请求对应的container的方法。

    在这之前有必要说下Container的初始化。

    在StandardService的initInternal()中会执行Container.init方法。这个开始的container表示StandardEngine,从Catalina.createDigester方法详细理解可以知道

    先调用构造方法

    /**
         * Create a new StandardEngine component with the default basic Valve.
         */
        public StandardEngine() {
    
            super();
            pipeline.setBasic(new StandardEngineValve());
            /* Set the jmvRoute using the system property jvmRoute */
            try {
                setJvmRoute(System.getProperty("jvmRoute"));
            } catch(Exception ex) {
                log.warn(sm.getString("standardEngine.jvmRouteFail"));
            }
            // By default, the engine will hold the reloading thread
            backgroundProcessorDelay = 10;
    
        }

     

    创建一个StandardEngine组件,为管道StandardPipeLine对象设置Basic,Basic即Vlave阀门对象,用于处理请求的对象。设置为StandardEngineValve()

    同样的,StandardEngine的Valve对象为StandardEngineValve

    在源码中也可以看到StandardHost的为:StandardHostValve,StandardContext的为:StandardContextValve,StandardWrapper的为:StandardWrapperValve

    connector.getService().getContainer().getPipeline().getFirst().invoke(request, response)

    Pipeline管道,getFirst()获得的是Pipeline存放的第一个Valve对象。Valve阀门。---------这些类的名字取得很形象

    管道连通着所有阀门,当水从供水局(有这个部门吗?)到我们的房子时候,首先要从水源处被抽水机抽到水处理厂,然后水处理厂收到请求信息(要将水放到城市里的哪个位置,这里即Host),水处理厂就会通过放水进入管道,而接受方就是城市的某个区,这时流到区的水经过区阀门处理转发到特定的村,村里又通过村子的阀门将水转发到特定的房子中,房子中就开始可以任意处置水了。

    上面水到具体房子过程,跟请求处理转发过程相似。

    Http11NioProcessor类对请求进行包装处理。通过CoyoteAdapter通过管道请求转发到第一个阀门中,然后又找到其下属StandardHost,StandardHostValve阀门又将请求转发到StandardContextValve上下文对象的阀门中进行对应的处理后继续转发到StandardWrapperValve阀门。StandardWrapperValve类对应的是一个Servlet类,这里就会对请求进行具体处理了。

    到这里就告一段落了,发现源码里还有很多我不认识的它,深究我就输了,再见!

  • 相关阅读:
    CSP-S2019 括号树
    [CQOI2007]余数求和
    CF1000E We Need More Bosses
    [HAOI2009]毛毛虫
    ls命令
    HTML的标签 属性 等等
    虚拟机安装Tools
    1.1 什么是安全渗透
    004-Kali Linux安装-熟悉环境
    003-Kali Linux 安装-持久加密USB安装、熟悉环境、熟悉BASH命令
  • 原文地址:https://www.cnblogs.com/gne-hwz/p/7833194.html
Copyright © 2020-2023  润新知