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