前四章节,主要对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
 
三、处理示意图
 

【Tomcat源码学习】-5.请求处理的更多相关文章

  1. Tomcat源码学习(1)

    Tomcat源码学习(1) IntelliJ IDEA 17.3.3 导入 Tomcat 9.0.6源码 下载源码 tomcat_9.0.6 启动 IDEA. 点击 Open,选择刚才下载的文件解压后 ...

  2. Tomcat源码学习

    Tomcat源码学习(一) 转自:http://carllgc.blog.ccidnet.com/blog-htm-do-showone-uid-4092-type-blog-itemid-26309 ...

  3. 【Tomcat源码学习】-1.概述

    Tomcat是用java语言开发的一个Web服务器,最近花了差不多两周时间对Tomcat 9.0源码进行了一遍学习,由于知识储备有限,也只是理解了一个大概,下面就由我来给大家分享一下我对Tomcat的 ...

  4. Tomcat源码学习记录--web服务器初步认识

    Tomcat作为开源的轻量级WEB服务器,虽然不是很适合某些大型项目,但是它开源,读其源代码可以很好的提高我们的编程功底和设计思维.Tomcat中用到了很多比较好的设计模式,其中代码风格也很值得我们去 ...

  5. Tomcat源码学习 - 环境搭建

    一. 源码下载 PS: 多图预警 在开始阅读源码之前,我们需要先构建一个环境,这样才能便于我们对源码进行调试,具体源码我们可以到官网进行下载(这里我以8.5.63版本为例). 二. 项目导入 下载并解 ...

  6. Tomcat源码学习一

    这段时间工作不太忙,所以抽时间学习了TOMCAT, TOMCAT实际就是负责保持TCP连接传递到部署的项目中.浏览器实质就是TCP发送器.将用户的请求封装成TCP发送请求.当然格式是双方协定的.使用的 ...

  7. 【Tomcat源码学习】-4.连接管理

    前面几节主要针对于Tomcat容器以及内容加载进行了讲解,本节主要针对于连接器-Connector进行细化,作为连接器主要的目的是监听外围网络访问请求,而连接器在启动相关监听进程后,是通过NIO方式进 ...

  8. Tomcat源码学习(3)—— Digester介绍

    Digester方法详解: 通读Digester之前先分析下他的结构: 1.1该类继承了方法DefaultHandler2,DefaultHandler2继承了DefaultHandler是和sax解 ...

  9. 【Tomcat源码学习】-2.容器管理

    Tomcat作为应用服务器,我们可以理解Tomcat本身就是一个容器,用于装载应用,而作为容器本身是由若干组件以及事件构成,容器管理即为管理容器的有机组成部分.   一.Tomcat整体结构: Ser ...

随机推荐

  1. javascript的字符串判断方法

    Javascript中判断符号主要有:==.!=.===.!== ==.!=这两个符号在判断之前会先对变量类型进行转换,如果类型相同会再比较值; ===.!==这是直接判断两个变量的类型,如果类型不一 ...

  2. swiper入门之快速实现轮播--手机端

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. Struts中数据处理

    对数据操作的3种方法(把数据保存到域中): 方式1:直接获取servletApi 核心类:ServletActionContext提供的静态方法 /** * 方式1:拿到servletApi,执行操作 ...

  4. Gridview AutoGenerateColumns属性

    第一篇随笔,以后会陆续的把刚开始工作时的知识点都记录下来,毕竟现在用WebForm的不多了~ AutoGenerateColumns MSDN 说明 : 获取或设置一个值,该值指示是否为数据源中的每个 ...

  5. Ajax写分页查询(实现不刷新页面)

    获取数据库中大量的信息显示在页面上,必然要使用到分页查询: 若不使用Ajax,而是用其他的方法,肯定是要刷新页面的,用户体检很不好, 所以最好使用Ajax的方法写分页查询: 1.先来找一张数据很多的表 ...

  6. windows python flask上传文件出现IOError: [Errno 13] Permission denied: 'E:\\git\\test\\static\\uploads'的解决方法

    在浏览器中输入时,出现IOError: [Errno 13] Permission denied: 'E:\\git\\test\\static\\uploads' http://127.0.0.1: ...

  7. css——样式表分类,选择器

    一,样式表分类 (1)内联样式[优先级最高][常用][代码重复使用性最差] (当特殊的样式需要应用到个别元素时,就可以使用内联样式. 使用内联样式的方法是在相关的标签中使用样式属性.样式属性可以包含任 ...

  8. Android -- onMeasure()源码分析

    1,作为自定义控件最重要的三个方法之一,onMeasure()可以说是我们研究的重点,今天我们更详细的来研究一下View的onMeasure()方法和ViewGroup的onMeasure()方法 2 ...

  9. XJOI1559树转二叉树

    树转二叉树 将一棵树转化成二叉树. 输入格式: 输入的信息,第一行一个数n,(n<=1000)是树的结点数,以下n行,第i+1行是第i个结点的信息,第一个整数,是该结点的特征数值,后列出所有孩子 ...

  10. CSS3学习笔记(1)-CSS3选择器

    p{ font-size: 15px; text-indent: 2em; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid ...