zoukankan      html  css  js  c++  java
  • 【Tomcat源码学习】4.连接管理

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





  • 相关阅读:
    组合数学——cf893E
    前缀和+贪心+线段树——cf893D
    期望线性性+线段树双tag标记——cf895E
    状压dp+数论——cf895C好题!
    官方资料&一些好的博客与技术点
    批处理小技巧总结
    使用 SP_OAXXX 创建文件夹,注意区别于 xp_cmdshell --mkdir xxx
    第一次使用并配置Hibernate
    做一个有心人
    强说愁
  • 原文地址:https://www.cnblogs.com/hframe/p/5328698.html
Copyright © 2011-2022 走看看