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





  • 相关阅读:
    移动零【283】
    下一个排列【31】
    插入区间【57】
    有效的山脉数组【941】
    两个数组的交集【349】
    求根到叶子节点数字之和【129】
    解决已经pip 安装成功的第三方包,但总是标红或者运行报错import PendingDeprecationWarning
    String、StringBuffer与StringBuilder之间区别
    《Java 核心技术第 10 版》-- 读书笔记
    【转载】如何保证消息不被重复消费?
  • 原文地址:https://www.cnblogs.com/hframe/p/5331879.html
Copyright © 2011-2022 走看看