tomcat6源码分析三(请求处理过程)
来源:互联网 发布:网络推广每日工作 编辑:程序博客网 时间:2024/05/12 00:11
本文主要通过流程图和序列图的方式剖析tomcat请求处理流程。从tomcat6源码分析一和tomcat6源码分析二两篇文章我们对tomcat的总体架构、核心模块、以及tomcat初始化和启动流程有了一个比较详细的了解。多个Connector和一个Container共同组成了一个Service,Service启动后便可以接收和处理用户http/ajp等请求。这里我们依HTTP1.1为例进行分析。Tomcat启动完成后,Acceptor在监听端口监听用户请求。
处理流程
图1 请求处理流程图(1)
图2 请求处理流程图(2)
CoyoteAdapter.service会调用我们的Servlet.service。经过长途跋涉,终于要把请求处理转发到了我们自己的servlet。CoyoteAdapter的处理流程很简单,见下图:
图3 CoyoteAdapter处理流程
Pipeline和Valve
这里要提到两个模块,一个是Pipeline,一个是Valve。Pipeline类似一个管道,Valve是管道中的阀门。每个容器都有一个Pipeline,每个Pipeline可以有多个Valve,但至少有一个ValveBase。每个请求流过管道时,各个Valve会对请求做相应的操作,这类似过滤器功能。
图4 Pipeline接口
图5 Valve接口
图6 Pipeline和Vavle接口
图7 Pipeline和Vavle过滤流程
Connector.getContainer().getPipeline().getFirst().invoke(request,response)请求处理过程如下。Connector.getContainer()得到StandardEngine.getFirst()得到StandardEngineValve。
图8 Valve工作流程
核心处理逻辑在StandardWrapperValve中完成,它包装了我们的Servlet,调用Servlet.service方法处理请求。到这里tomcat把请求转发给我们自己写的Servlet处理。这里为了阐述方便去掉了一些处理细节分析。
StandardWrapperValve.invoke方法的处理逻辑:
- 调用wrapper.allocate()分配一个Servlet
- response.sendAcknowledgement() 发送一个ack到客户端
- request.getRequestPathMB() 获取请求路径
- createFilterChain(request, wrapper, servlet) 创建过滤链
- doFilter 执行过滤链,serlvet.service()方法也在其中
- 回收servlet实例
- tomcat6源码分析三(请求处理过程)
- tomcat6源码分析三(请求处理过程)
- [Tomcat6.0源码]请求的处理三Mapper、JMX
- struts2的请求处理过程源码分析
- struts2的请求处理过程源码分析
- struts2的请求处理过程源码分析
- SpringMVC源码分析 DispatcherServlet请求处理过程
- struts1源码分析(三)请求处理主线
- struts1源码分析(三)请求处理主线
- Struts2源码粗略分析三:请求处理流程分析
- tomcat6-源码分析(1)
- tomcat6-源码分析(2)
- 浅读Tomcat源码(三)---请求处理
- 浅读Tomcat源码(三)---请求处理
- [Tomcat6.0源码]请求的处理一Socket
- [Tomcat6.0源码]请求的处理二Request
- [Tomcat6.0源码]请求的处理四Pipeline、Valve、FilterChain
- struts2请求过程源码分析
- 判断字符串最后一个字符是否为.号
- python数字即数学函数
- mongodb中的更新和插入操作
- 线段树 基础
- Cracking coding iterview(1.6)Rotate NXN Matrix
- tomcat6源码分析三(请求处理过程)
- 设计模式学习笔记之装饰者模式
- Cocos2dx static变量的声明和初始化
- HIT OJ 2255 Not Fibonacci (矩阵快速幂)
- atitit.基于http json api 接口设计 最佳实践 总结o7
- wiki 1256 打鼹鼠
- Nginx安装
- HTML 5 Canvas通过 JavaScript 来绘制
- 尚硅谷程序-java 封装登陆程序 1-2static 的一些相关应用 2-2代码块 3-1final关键字