Tomcat连接流程
-
tomcat 启动 EndPoint 开启一个 ServerSocketChannel 服务监听对应端口,这里的服务是阻塞的
-
tomcat 开启一个线程池,暂且叫做工作线程
-
tomcat 开启多个Poller线程,默认只开启一个
-
tomcat 开启多个Acceptor线程
-
Acceptor 线程轮询 ServerSocketChannel ,如果有连接到来获取对应的 Socket 对象,没有则继续轮询
-
Acceptor 获取到 Socket 对象后,调用 Endpoint 的 setSocketOptions 方法,并把 Socket 对象传入
-
setSocketOptions 方法把传入的 Socket 对象设置为非阻塞,并把Socket对象和Buffer对象封装成一个 Channel 对象注册到 Poller 中
-
Poller 中持有一个 Selector 对象,并且维护了一个 PollerEvent 对象的队列
-
Poller 的注册方法会把传入的 Channel 对象包装为一个 PollerEvent 对象,并添加到 PollerEvent 的队列中
-
Poller 循环遍历 PollerEvent 对象的队列, 调用获取到的 PollerEvent 的 run 方法
-
PollerEvent 对象的 run 方法会把 SocketChannel 注册到 Poller 的 Selector 中,并监听 OP_READ 事件
-
Poller 的run方法中会遍历 Selector,如果有消息到来会调用 processKey 方法
-
processKey 方法会根据读写事件调用 processSocket 方法
-
processSocket 方法会把传入的 event 封装成一个 SocketProcessorBase 对象,最后交给线程池去执行