技术开发 频道

Tomcat处理HTTP请求:Connector模块

  三、Connector源码分析

  1.Tomcat的启动分析与集成设想

  我们知道,启动tomcat有两种方式:双击bin/startup.bat、运行bin/catalina.bat run。

  它们对应于Bootstrap与Catalina两个类,我们现在只关心Catalina这个类,这个类使用Apache Digester解析conf/server.xml文件生成tomcat组件,然后再调用Embedded类的start方法启动tomcat。

  所以,集成Tomcat的方式就有以下两种了:

  ①沿用tomcat自身的server.xml

  ②自己定义一个xml格式来配置tocmat的各参数,自己再写解析这段xml,然后使用tomcat提供的API根据这些xml来生成Tomcat组件,最后调用Embedded类的start方法启动tomcat

  个人觉得第一种方式要优越,给开发者比较好的用户体验,如果使用这种,直接模仿Catalina类的方法即可实现集成。

  目前,JOnAS就使用了这种集成方式,JBoss、GlassFish使用的第二种自定义XML的方式。

  2. Connector类图与顺序图

  ▲Connector相关类图

  ▲工作流程顺序图

  从上面二图中我们可以得到如下信息:

  Tomcat中有四种容器(Context、Engine、Host、Wrapper),前三者常见,第四个不常见但它也是实现了Container接口的容器

  如果要自定义一个Connector的话,只需要实现ProtocolHander接口,该接口定义如下:

  ▲自定义Connector时需实现的ProtoclHandler接口

  Tomcat以HTTP(包括BIO与NIO)、AJP、APR、内存四种协议实现了该接口(它们分别是:AjpAprProtocol、AjpProtocol、Http11AprProtocol、Http11NioProtocol、Http11Protocal、JkCoyoteHandler、MemoryProtocolHandler),要使用哪种Connector就在conf/server.xml中配置,在Connector的构造函数中会通过反射实例化所配置的实现类:

<Connector port="8181"
   protocol
="org.apache.coyote.http11.Http11AprProtocol " />

  3.Connector的工作流程

  下面我们以Http11AprProtocol为例说明Connector的工作流程。

  ①它将工作委托给NioEndpoint类。在NioEndpoint类的init方法中构建一个SocketServer(当然,不同的实现类会有一些微小的变化,例如如果是NIO,它构建的就是SocketServerChannel)

  ②在NioEndpoint.Acceptor类中会接收一个客户端新的连接请求,如下图:

  ③在NioEndpoint类中,有一个内部接口Handle,该接口定义如下:

  ④在Http11NioProtocol类中实现了Handle这个内部接口,并调用Http11NioProcessor类(该类实现了ActionHook回调接口)。在Response类中会调用ActionHook实现类的相关方法的,Response类的action方法如下:

  ⑤Http11NioProcessor的process实现方法中,会通过Adapter来调用Servler容器生成响应结果。

0
相关文章