Tomcat连接流程

818 阅读1分钟

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 对象,最后交给线程池去执行