Tomcat源码分析(4)--StandardService类中涉及到的初始化和启动
initInternal方法
同server一样,service不存在init方法,也有一个从父类中查找init方法的过程,分别通过LifecycleMBeanBase和lifeCycle类,最后定位到本类的initinternal方法
该方法实现如下:
实际上就是执行service节点下engine、executor和connector节点对应类的init方法。重点讲下engine和connector。
Connector的init方法
protocolHandler是ProtocolHandler的一个实例,该类的继承关系如下:
直接定位到具体的实现类,其部分实现是:
在AbstractProtocol类中完成的大部分功能是将对象注册到JMX服务器
下面这个对象是和socket处理相关的,也是需要我们深入了解的
endpoint是AbstractEndpoint 具体实现类的对象,该类的继承关系是
这里我们只看NIOEndpoint相关的部分
这个方法调用了其父类AbstractEndpoint的init方法,该方法代码实现如下:
这个方法中调用了本类的抽象方法bind方法,我们直接定位到其实现类NIOEndpoint中,其实现代码如下:
这里面主要进行了NIO有关的配置,如开启通道和选择器等
startInternal方法
该方法实现如下:
Connector的start方法
和其init方法类似,这里主要是调用其内置对象ProtocolHandler的start方法,代码如下:
protocolhandler对象的start方法代码实现如下:
endpoint对象的start方法代码实现如下:
这里调用了本类的抽象startInternal方法,通过该方法定位到NIOEndPoint类中,该类的代码实现如下:
acceptor
上面startAcceptorThreads()方法中其实是启动acceptor线程的,其代码如下:
acceptor其实是内部抽象类,其继承关系如下:
我们直接定位到NioEndpoint内部类Acceptor的run方法中
这个方法中充分体现了acceptor的作用就是监听客户端的连接,需要注意的是这里的socket对象是SocketChannel类型的,接收到请求后通过 setSocketOption()将这个channel传递给poller线程
下面看看setSocketOption方法的代码实现:
SocketBufferHandler这个类封装了两个ByteBuffer类型的对象,分别作为写缓存和读缓存
Poller
本线程类的run方法如下:
SelectionKey中封装了channel的相关信息,然后将其传递到processKey中进行处理
后面的部分在请求处理这一章讲。