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

 
一、整体设计
  1. Connector在创建时,会根据Connector的协议创建对应的ProtocolHandler处理类

    协议标识 普通模式 Apr模式
    HTTP/1.1
    org.apache.coyote.http11.Http11NioProtocol
    org.apache.coyote.http11.Http11AprProtocol
    AJP/1.3
    org.apache.coyote.ajp.AjpNioProtocol
    org.apache.coyote.ajp.AjpAprProtocol
  2. ProtocolHandler处理类包含对应的端点处理类,比如Http11NioProtocol的端点处理类为NioEndpoint
  3. NioEndpoint:对应一个ServerSocketChannel通道,在启动过程中,会分别初始化SocketProcessor、PollerEvent、NioChannel缓存堆结构,以及请求处理的线程池Executor,最后将会初始化两组用于请求处理线程Acceptor、Poller
  4. Acceptor:默认只有一个线程、用于接收请求,并将请求信息封装为PollEvent对象放入PollEvent待处理队列中
    • 如果端点处于暂停状态,50s探测一次
    • 连接数+1,并判断是否超最大连接数(LimitLantch实现),如果超了阻塞等待
    • 通过ServerSocketChannel.accept()等待新的请求
    • 将SocketChannel请求信息封装为NioChannel(NioChannel从缓存中读取,没有就新生成)
    • 将NioChannel封装为PollerEvent(PollerEvent从缓存中读取,没有就新生成)
  5. Poller:默认两个线程,扫描PollEvent队列,进行处理,启动业务处理线程SocketProcessor
    • 循环扫描,PollEvent队列中是否存在待处理事件
    • 从SelectionKey中获取NioSocketWrapper对象((NioSocketWrapper)sk.attachment())
    • 将NioSockectWrapper对象封装成SocketProcessor(从缓存中读取,没有就新生成)
    • 线程池启动SocketProcessor线程处理
    • SocketProcessor线程调用ConnectionHandler进行处理,ConnectionHandler获取一个Processor进行处理(Processor也存在一个对象堆缓存,Stack实现)
  6. NioChannel:是对一个Socket的字节流的封装,一个NioChannel对应一个SocketChannel
  7. Executor:线程池
 
二、启动流程
  • NioSelectorPoll:待细化
  • NioBlockingSelector:待细化
  • BlockPoller:待细化
  • AsyncTimeout:待细化
三、类图
   这样,我们在Connector启动后,对应的监听进程就已经就绪,接下来只有有对应的网络请求发送后,都会被监听并处理,而这部分内容将会在下一节进行讲解。
 
 

【Tomcat源码学习】-4.连接管理的更多相关文章

  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源码学习 - 环境搭建

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

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

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

  6. TOMCAT源码分析——生命周期管理

    前言 从server.xml文件解析出来的各个对象都是容器,比如:Server.Service.Connector等.这些容器都具有新建.初始化完成.启动.停止.失败.销毁等状态.tomcat的实现提 ...

  7. Tomcat源码学习一

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

  8. Mybatis源码学习之事务管理(八)

    简述 在实际开发中,数据库事务的控制是一件非常重要的工作,本文将学习Mybatis对事务的管理机制.在Mybatis中基于接口 Transaction 将事务分为两种,一种是JdbcTransacti ...

  9. Python 源码学习之内存管理 -- (转)

    Python 的内存管理架构(Objects/obmalloc.c): _____ ______ ______ ________ [ int ] [ dict ] [ list ] ... [ str ...

随机推荐

  1. 使用GDI绘制文本

    /// <summary>        /// 定义一个绘制文本        /// </summary>        public void Texts()       ...

  2. HTML,login文本框·

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

  3. VisualStudio2017下ASP.NET CORE的TagHelper智能提示解决办法

    之前在VS2017RC中就发现该问题,安装了依赖,但是前段一直点不出来asp-for,后来查了发行说明, 才知道在VS2017rc中暂时无法解决,所以一直等到VS2017正式版的发布,急冲冲的装好, ...

  4. Pow(x, n) leetcode

    Implement pow(x, n). Subscribe to see which companies asked this question 利用依次消去二进制位上的1,来进行计算 double ...

  5. UI 设计模式 手势识别器

    1> target / action 设计模式 : target ['tɑːgɪt]         1>什么是耦合 : 耦合是衡量一个程序呢写的好坏的标准之一 耦合是衡量模块与模块之间关 ...

  6. C中运算符优先级

    总体规则: 特殊运算符>单目运算符>双目运算符>三目运算符>赋值运算符>逗号运算符 只有单目运算符是右结合,其余的均为左结合

  7. Delphi的Hint介绍以及用其重写气泡提示以达到好看的效果

    Delphi中使用提示是如此简单,只需将欲使用Hint的控件作如下设置: ShowHint := True; Hint := ‘提示信息’; 不必写一行代码,相当方便. 但有时我们又想自己定制提示的效 ...

  8. SQL Server中的Merge关键字 更新表数据

    简介 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根 ...

  9. select count(*)优化 快速得到总记录数

    1.select count(*) from table_name 比select count(主键列) from table_name和select count(1) from table_name ...

  10. jsp中九大内置对象

    jsp实质是一个Servlet类,当jsp页面第一次被访问时,就会被服务器翻译成.java文件,紧接着就编译成.class文件. jsp<% %>和<%= %>脚本中可以直接使 ...