Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

initInternal方法

同server一样,service不存在init方法,也有一个从父类中查找init方法的过程,分别通过LifecycleMBeanBase和lifeCycle类,最后定位到本类的initinternal方法

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

该方法实现如下:

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

实际上就是执行service节点下engine、executor和connector节点对应类的init方法。重点讲下engine和connector。

Connector的init方法

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

protocolHandler是ProtocolHandler的一个实例,该类的继承关系如下:

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

直接定位到具体的实现类,其部分实现是:

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

在AbstractProtocol类中完成的大部分功能是将对象注册到JMX服务器

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

下面这个对象是和socket处理相关的,也是需要我们深入了解的

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

endpoint是AbstractEndpoint 具体实现类的对象,该类的继承关系是

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

这里我们只看NIOEndpoint相关的部分

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

这个方法调用了其父类AbstractEndpoint的init方法,该方法代码实现如下:

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

这个方法中调用了本类的抽象方法bind方法,我们直接定位到其实现类NIOEndpoint中,其实现代码如下:

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

这里面主要进行了NIO有关的配置,如开启通道和选择器等

startInternal方法

该方法实现如下:

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

Connector的start方法

和其init方法类似,这里主要是调用其内置对象ProtocolHandler的start方法,代码如下:

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

protocolhandler对象的start方法代码实现如下:

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

endpoint对象的start方法代码实现如下:

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

这里调用了本类的抽象startInternal方法,通过该方法定位到NIOEndPoint类中,该类的代码实现如下:

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

acceptor

上面startAcceptorThreads()方法中其实是启动acceptor线程的,其代码如下:

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

acceptor其实是内部抽象类,其继承关系如下:

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

我们直接定位到NioEndpoint内部类Acceptor的run方法中

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

这个方法中充分体现了acceptor的作用就是监听客户端的连接,需要注意的是这里的socket对象是SocketChannel类型的,接收到请求后通过 setSocketOption()将这个channel传递给poller线程
下面看看setSocketOption方法的代码实现:

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

SocketBufferHandler这个类封装了两个ByteBuffer类型的对象,分别作为写缓存和读缓存

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

Poller

本线程类的run方法如下:

Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动

SelectionKey中封装了channel的相关信息,然后将其传递到processKey中进行处理
后面的部分在请求处理这一章讲。