登录 / 注册
IT168技术开发频道
IT168首页 > 技术开发 > 技术开发技术 > 正文

Tomcat处理HTTP请求:Connector源码

2011-12-20 13:52    来源:InfoQ  作者: 张华 编辑: 苏巧红

  【IT168技术】很多开源应用服务器都是集成tomcat作为web container的,而且对于tomcat的servlet container这部分代码很少改动。这样,这些应用服务器的性能基本上就取决于Tomcat处理HTTP请求的connector模块的性能。本文首先从应用层次分析了tomcat所有的connector种类及用法,接着从架构上分析了connector模块在整个tomcat中所处的位置,最后对connector做了详细的源代码分析。并且我们以Http11NioProtocol为例详细说明了tomcat是如何通过实现ProtocolHandler接口而构建connector的。如何实现Connector

  相关阅读:Tomcat处理HTTP请求:Connector模块

  如何实现Connector

  由上面的介绍我们可以知道,实现Connector就是实现ProtocolHander接口的过程。

  AjpAprProtocol、AjpProtocol、Http11AprProtocol、Http11Protocol、JkCoyoteHandler、MemoryProtocolHandler这些实现类的实现流程与Http11NioProtocol相同,下面我们以Http11NioProtocol为类重点说明tomcat中如何实现ProtocolHander接口的。

  Http11NioProtocol实现了ProtocolHander接口,它将所有的操作委托给NioEndpoint类去做,如下图:

  Tomcat处理HTTP请求:Connector源码

  NioEndpoint类中的init方法中首先以普通阻塞方式启动了SocketServer:

  Tomcat处理HTTP请求:Connector源码

  NioEndpoint类的start方法是关键,如下:

  Tomcat处理HTTP请求:Connector源码

  可以看出,在start方法中启动了两个线程和一个线程池:

  ①Acceptor线程,该线程以普通阻塞方式接收客户端请求(socket.accep()),将客户Socket交由线程池是处理,线程池要将该Socket配置成非阻塞模式(socket.configureBlocking(false)),并且向Selector注册READ事件。该线程数目可配置,默认为1个。

  ②Poller线程,由于Acceptor委托线程为客户端Socket注册了READ事件,当READ准备好时,就会进入Poller线程的循环,Poller线程也是委托线程池去做,线程池将NioChannel加入到ConcurrentLinkedQueue队列中。该线程数目可配置,默认为1个。

  ③线程池,就是上面说的做Acceptor与Poller线程委托要做的事情。

标签: Tomcat , Java
相关文章
  • 2011-12-20
  • 2011-12-20
  • 2011-12-20
网友评论
已有0条评论
  • IT168企业级IT168企业级
  • IT168文库IT168文库

扫码送文库金币

编辑推荐
系统架构师大会
系统架构师大会
点击或扫描关注
IT168企业级微信关注送礼
IT168企业级微信关注送礼
扫描关注
首页 评论 返回顶部