zoukankan      html  css  js  c++  java
  • 【Tomcat源码学习】5.请求处理

           前四章节,主要对Tomcat启动过程中,容器加载、应用加载、连接器初始化进行了相关的原理和代码流程进行了学习、接下来开始进行接受网络请求后的相关处理学习。

     
    一、整体流程
         基于上一节图示进行细化,将由于初始化后,增加运行态流程
    • 由图示,我们可以看出,当监听到网络请求后,将NioSocketWrapper attachment, SocketEvent status的信息交给SocketProcessor线程进行处理
    • SocketProcessor线程调用ConnectionHandler连接处理类进行业务处理
    • Processor调用ProtocolHandler中对应的适配器进行统一处理(CoyotoAdapter)
    • CoyoteAdaptor提交至容器管理Pipeline进行处理
    • Pipeline在容器内,依次调用子容器进行请求转发,直到最小容器Servlet,Servlet处理后原路径返回,如下图
    二 细化流程
           
    • Poller循环扫描PollerEvent队列是否存在待处理请求
    • 如果存在PollerEvent待处理,进行请求解析封装
    • 启动SocketProcessor线程进行请求读处理
    • SocketProcessor线程调用ConnectionHandler进行处理
    • ConnectionHandler从对象堆中获取一个Processor,并封装request、reponse对象
    • 将Processor作为MBean进行JVM注册
    • 调用Processor进行请求处理,对Http请求行、消息报头进行处理
    • 调用CoyoteAdaptor进行请求处理转发,调用Engine的Pipe进行转发
    • Engine的PipeLine进行转发时,从外层依次调用里层子容器,直到Servlet最终结果
    • 在进行PipeLine层次转发时,每一层都会对请求进行处理与封装为对应的数据结构,如:StandardEngineValue、StandardHostValue、StandardContextValue、StandardWrapperValue
    • StandardWrapper判断Servlet是否实例化,如果没有实例,进行实例化同时调用Servlet的init()方法以及调用发起对应的监听事件
    • 如果Servlet非单例模式(未实现SingleThreadModel接口),每次请求从Servlet实例池中获取实例,如果操作最大限制进行等待
    • StandardWrapperValue调用ApplicationFilterFactory获取一个ApplicationFilterChain.
    • ApplicationFilterChain执行过滤请求、然后调用Servlet进行业务处理
    • 释放拦截器、释放Servlet
     
    三、处理示意图
     





  • 相关阅读:
    解决IE下a标签点击有虚线边框的问题
    解决IE8下opacity属性失效问题
    用Vue.js开发微信小程序:开源框架mpvue解析
    使用pie.htc时Border-radius的兼容
    解决IE8下CSS3选择器 :nth-child() 不兼容的问题
    jQuery兼容浏览器IE8方法
    css3兼容IE8的方案 各个ie的hack
    JavaScript之旅(DOM)
    JavaScript之旅(三)
    JavaScript之旅(二)
  • 原文地址:https://www.cnblogs.com/hframe/p/5331879.html
Copyright © 2011-2022 走看看