Tomcat中的Acceptor,Poller(Tomcat接收一个连接的处理过程)

1,117 阅读1分钟

​ Tomcat内部是用Acceptor,Poller来处理客户端的Socket连接的。Acceptor,Poller模型类似于Reactor网络编程模型的实现。关于Reactor网上参考有很多,这里不再赘述。

​ 本文将从以下几个方面介绍:

一、Acceptor、Poller是什么时候被启动的

Acceptor,Poller的启动在NioEndPoint的这个startInternal方法里。startInternal方法在后面讲解Tomcat的架构会介绍,这里可以先不管。

image-20201209231014985.png

打开调用的方法栈,可以看到是什么时候进入到这个方法的:

image-20201209231727277.png

从SpringBoot的启动函数开始看:

image-20201209231840583.png

sping的上下文会调用一系列的函数,

image-20201209231940536.png

在refresh函数的最后阶段,调用了finishRefresh方法

image-20201209232022289.png

进来是调用startEmbeddedServletContainer方法

image-20201209232128144.png

一路下去就是刚才的startInternal方法,调用栈都是在main线程,比较简单就能进入到这个方法里

可以看到是先启动Poller,在启动Acceptor线程的。

image-20201209232527063.png

还可以看到NioEndpoint里不只有一个Poller,是一个Poller的数组

image-20201209233754385.png

acceptors也是个数组(但其实默认是只有1个)

image-20201209233912436.png

下面是Poller的初始化

二、Poller初始化流程

// 介绍下Poller的属性 和初始化函数