前面几节主要针对于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启动后,对应的监听进程就已经就绪,接下来只有有对应的网络请求发送后,都会被监听并处理,而这部分内容将会在下一节进行讲解。
 
 

最新文章

  1. 洛谷P1547 Out of Hay
  2. MongoDB学习笔记~关于官方驱动集成IQueryable之后的一些事
  3. Android画面显示原理
  4. C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)
  5. HDU 3549 Flow Problem(最大流)
  6. 查看一个int数组里边的每个数字出现过几次
  7. 使用(Drawable)资源———AnimationDrawable资源
  8. Matlab绘图基础——散点生成三角网(TIN)
  9. 【转】spring cloud eureka 参数配置
  10. socket并发聊天
  11. upload-labs
  12. 《Inside C#》笔记(八) 接口
  13. count(*) count(1) count(column)区别
  14. 【转】libxml2 如何获得某个节点的所有信息
  15. mysql优化概述2
  16. 20145209 2016-2017-2 《Java程序设计》第7周学习总结
  17. Python开发【Django】:Form组件
  18. Mkdocs 搭建
  19. java quartz
  20. is和==的区别以及编码、解码

热门文章

  1. 《你不知道的JavaScript》整理(五)——值与原生函数
  2. Spring 3.0 Aop 入门
  3. poj 2229 DP
  4. Java面试05|MySQL及InnoDB引擎
  5. Rabbitmq集群高可用部署详细
  6. Python中的日期和时间
  7. iOS全角符与半角符之间的转换
  8. c#关于时间TimeHelper类的总结
  9. Babel指南——基本环境搭建
  10. python遍历一个目录,输出所有文件名