mysterin / question_and_answer

1 stars 0 forks source link

tomcat 启动接收请求过程 #123

Closed mysterin closed 5 years ago

mysterin commented 5 years ago

tomcat 启动过程

public void start() throws LifecycleException {
    getServer();
    getConnector();
    server.start();
}

getServer() 用来创建 Service, 然后把 Service 加入到 Server. getConnector() 用来创建 Connector, 然后把 Connector 加入到 Service. Connector 的创建会创建 Http11NioProtocol, 而 Http11NioProtocol 的创建也会去创建 NioEndpoint. server.start() 会逐步初始化 Server, Service, Connector, Http11NioProtocol, NioEndpoint. 具体过程大概就是先调用这些对象的 init() 方法初始化, 然后调用对应的 start() 方法完成.

EndPoint

上面的初始化主要看 NioEndpoint 的初始化. 这个对象的初始化会绑定端口监听, 然后创建一个处理请求的线程池, 两个 Poller 线程, 一个用来等待连接请求的 Acceptor 线程. 具体就是 Acceptor 线程等待 socket 连接, 一旦连接上了, 就把连接封装成 PollerEvent 加入到 Event 队列中; 然后 Poller 线程会从队列取出 PollerEvent, 交给线程池处理.