Tomcat内部是用Acceptor,Poller来处理客户端的Socket连接的。Acceptor,Poller模型类似于Reactor网络编程模型的实现。关于Reactor网上参考有很多,这里不再赘述。
本文将从以下几个方面介绍:
一、Acceptor、Poller是什么时候被启动的
Acceptor,Poller的启动在NioEndPoint的这个startInternal方法里。startInternal方法在后面讲解Tomcat的架构会介绍,这里可以先不管。
打开调用的方法栈,可以看到是什么时候进入到这个方法的:
从SpringBoot的启动函数开始看:
sping的上下文会调用一系列的函数,
在refresh函数的最后阶段,调用了finishRefresh方法
进来是调用startEmbeddedServletContainer方法
一路下去就是刚才的startInternal方法,调用栈都是在main线程,比较简单就能进入到这个方法里
可以看到是先启动Poller,在启动Acceptor线程的。
还可以看到NioEndpoint里不只有一个Poller,是一个Poller的数组
acceptors也是个数组(但其实默认是只有1个)
下面是Poller的初始化
二、Poller初始化流程
// 介绍下Poller的属性 和初始化函数