【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
 
三、处理示意图
 





原文地址:https://www.cnblogs.com/hframe/p/5331879.html