前面几节主要针对于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. Struts2环境的搭建

    1. Struts2 获取http://struts.apache.org/download.cgiStruts-2.3.16.3-all.zip 了解主要目录 apps :该文件夹下包含了基于Str ...

  2. MySQL Sniffer

    MySQL Sniffer 是360开源的一个基于 MySQL 协议的抓包工具, 能实时抓取客户端端请求,并格式化输出操作语句,操作十分简单.对于问题的定位,操作的审核是个不错的利器. Github地 ...

  3. n的阶乘

    涉及阶乘的都会产生大的数据,此时要变成long或者实在很大要使用BigInteger 题目描述 输入一个整数n,输出n的阶乘 输入描述: 一个整数n(1<=n<=20) 输出描述: n的阶 ...

  4. jQuery测验题

    1.在div元素中,包含了一个<span>元素,通过has选择器获取<div>元素中的<span>元素的语法是? 提示使用has() $("div:has ...

  5. MyEclipse下安装MyBatis Generator代码反向生成工具

    一.离线方式: 在http://mybatis.googlecode.com/svn/sub-projects/generator/trunk/eclipse/UpdateSite/下载 featur ...

  6. C# 在PDF中创建和填充域

    C# 在PDF中创建和填充域 众所周知,PDF文档通常是不能编辑和修改的.如果用户需要在PDF文档中签名或者填写其他内容时,就需要PDF文档中有可编辑的域.开发者也经常会遇到将数据以编程的方式填充到P ...

  7. virtual dom的实践

    最近基于virtual dom 写了一个小框架-aoy. aoy是一个轻量级的mvvm框架,基于Virtual DOM.虽然现在看起来很单薄,但我做了完善的单元测试,可以放心使用.aoy的原理可以说和 ...

  8. spdlog源码阅读 (3): log_msg和BasicWriter

    4. log_msg和它的打手BasicWriter 在spdlog源码阅读 (2): sinks的创建和使用中,提到log_msg提供了存储日志的功能.那么到底在spdlog中它是怎么 起到这个作用 ...

  9. 【Java基础】通过getResourceAsStream() 加载资源文件

    Class.getResourceAsStream(String path) path不以"/"开头时,默认是从当前类所在的包下面获取资源 path以"/"开头 ...

  10. MySQL二进制日志总结

    二进制日志简单介绍 MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的MySQL语句.二进制日志(binary log)中记录了对MySQL数据 ...