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





  • 相关阅读:
    k8s 存活探针(健康检查)
    数据库CPU 100%处理记录
    zabbix 批量安装+自动注册
    Docker 学习目录
    ubuntu18启动zabbix-agent失败/故障记录
    使用Docker构建企业Jenkins CI平台
    记一次服务被黑处理过程
    ELK数据迁移,ES快照备份迁移
    脚本监控服务状态 微信-钉钉告警
    邮箱附件脚本
  • 原文地址:https://www.cnblogs.com/hframe/p/5331879.html
Copyright © 2020-2023  润新知