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

- 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
- ProtocolHandler处理类包含对应的端点处理类,比如Http11NioProtocol的端点处理类为NioEndpoint
- NioEndpoint:对应一个ServerSocketChannel通道,在启动过程中,会分别初始化SocketProcessor、PollerEvent、NioChannel缓存堆结构,以及请求处理的线程池Executor,最后将会初始化两组用于请求处理线程Acceptor、Poller
- Acceptor:默认只有一个线程、用于接收请求,并将请求信息封装为PollEvent对象放入PollEvent待处理队列中
- 如果端点处于暂停状态,50s探测一次
- 连接数+1,并判断是否超最大连接数(LimitLantch实现),如果超了阻塞等待
- 通过ServerSocketChannel.accept()等待新的请求
- 将SocketChannel请求信息封装为NioChannel(NioChannel从缓存中读取,没有就新生成)
- 将NioChannel封装为PollerEvent(PollerEvent从缓存中读取,没有就新生成)
- Poller:默认两个线程,扫描PollEvent队列,进行处理,启动业务处理线程SocketProcessor
- 循环扫描,PollEvent队列中是否存在待处理事件
- 从SelectionKey中获取NioSocketWrapper对象((NioSocketWrapper)sk.attachment())
- 将NioSockectWrapper对象封装成SocketProcessor(从缓存中读取,没有就新生成)
- 线程池启动SocketProcessor线程处理
- SocketProcessor线程调用ConnectionHandler进行处理,ConnectionHandler获取一个Processor进行处理(Processor也存在一个对象堆缓存,Stack实现)
- NioChannel:是对一个Socket的字节流的封装,一个NioChannel对应一个SocketChannel
- Executor:线程池

- NioSelectorPoll:待细化
- NioBlockingSelector:待细化
- BlockPoller:待细化
- AsyncTimeout:待细化


【Tomcat源码学习】-4.连接管理的更多相关文章
- Tomcat源码学习(1)
Tomcat源码学习(1) IntelliJ IDEA 17.3.3 导入 Tomcat 9.0.6源码 下载源码 tomcat_9.0.6 启动 IDEA. 点击 Open,选择刚才下载的文件解压后 ...
- Tomcat源码学习
Tomcat源码学习(一) 转自:http://carllgc.blog.ccidnet.com/blog-htm-do-showone-uid-4092-type-blog-itemid-26309 ...
- 【Tomcat源码学习】-1.概述
Tomcat是用java语言开发的一个Web服务器,最近花了差不多两周时间对Tomcat 9.0源码进行了一遍学习,由于知识储备有限,也只是理解了一个大概,下面就由我来给大家分享一下我对Tomcat的 ...
- Tomcat源码学习 - 环境搭建
一. 源码下载 PS: 多图预警 在开始阅读源码之前,我们需要先构建一个环境,这样才能便于我们对源码进行调试,具体源码我们可以到官网进行下载(这里我以8.5.63版本为例). 二. 项目导入 下载并解 ...
- Tomcat源码学习记录--web服务器初步认识
Tomcat作为开源的轻量级WEB服务器,虽然不是很适合某些大型项目,但是它开源,读其源代码可以很好的提高我们的编程功底和设计思维.Tomcat中用到了很多比较好的设计模式,其中代码风格也很值得我们去 ...
- TOMCAT源码分析——生命周期管理
前言 从server.xml文件解析出来的各个对象都是容器,比如:Server.Service.Connector等.这些容器都具有新建.初始化完成.启动.停止.失败.销毁等状态.tomcat的实现提 ...
- Tomcat源码学习一
这段时间工作不太忙,所以抽时间学习了TOMCAT, TOMCAT实际就是负责保持TCP连接传递到部署的项目中.浏览器实质就是TCP发送器.将用户的请求封装成TCP发送请求.当然格式是双方协定的.使用的 ...
- Mybatis源码学习之事务管理(八)
简述 在实际开发中,数据库事务的控制是一件非常重要的工作,本文将学习Mybatis对事务的管理机制.在Mybatis中基于接口 Transaction 将事务分为两种,一种是JdbcTransacti ...
- Python 源码学习之内存管理 -- (转)
Python 的内存管理架构(Objects/obmalloc.c): _____ ______ ______ ________ [ int ] [ dict ] [ list ] ... [ str ...
随机推荐
- Struts2环境的搭建
1. Struts2 获取http://struts.apache.org/download.cgiStruts-2.3.16.3-all.zip 了解主要目录 apps :该文件夹下包含了基于Str ...
- MySQL Sniffer
MySQL Sniffer 是360开源的一个基于 MySQL 协议的抓包工具, 能实时抓取客户端端请求,并格式化输出操作语句,操作十分简单.对于问题的定位,操作的审核是个不错的利器. Github地 ...
- n的阶乘
涉及阶乘的都会产生大的数据,此时要变成long或者实在很大要使用BigInteger 题目描述 输入一个整数n,输出n的阶乘 输入描述: 一个整数n(1<=n<=20) 输出描述: n的阶 ...
- jQuery测验题
1.在div元素中,包含了一个<span>元素,通过has选择器获取<div>元素中的<span>元素的语法是? 提示使用has() $("div:has ...
- MyEclipse下安装MyBatis Generator代码反向生成工具
一.离线方式: 在http://mybatis.googlecode.com/svn/sub-projects/generator/trunk/eclipse/UpdateSite/下载 featur ...
- C# 在PDF中创建和填充域
C# 在PDF中创建和填充域 众所周知,PDF文档通常是不能编辑和修改的.如果用户需要在PDF文档中签名或者填写其他内容时,就需要PDF文档中有可编辑的域.开发者也经常会遇到将数据以编程的方式填充到P ...
- virtual dom的实践
最近基于virtual dom 写了一个小框架-aoy. aoy是一个轻量级的mvvm框架,基于Virtual DOM.虽然现在看起来很单薄,但我做了完善的单元测试,可以放心使用.aoy的原理可以说和 ...
- spdlog源码阅读 (3): log_msg和BasicWriter
4. log_msg和它的打手BasicWriter 在spdlog源码阅读 (2): sinks的创建和使用中,提到log_msg提供了存储日志的功能.那么到底在spdlog中它是怎么 起到这个作用 ...
- 【Java基础】通过getResourceAsStream() 加载资源文件
Class.getResourceAsStream(String path) path不以"/"开头时,默认是从当前类所在的包下面获取资源 path以"/"开头 ...
- MySQL二进制日志总结
二进制日志简单介绍 MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的MySQL语句.二进制日志(binary log)中记录了对MySQL数据 ...