首页  

Tomcat NIO 处理机制     所属分类 tomcat 浏览量 1087
tomcat8.5

几种IO方式 
BIO 同步阻塞   NIO 同步非阻塞  AIO 异步非阻塞
Java NIO  IO多路复用 一个线程处理多个客户端连接

Tomcat NIO模式
客户端的请求先由一个接收线程接收
然后由若干个(一般为CPU的个数)线程轮询读写事件
最后将具体的读写操作交由线程池处理

不同IO方式的读写封装在Endpoint中 NioEndpoint

channel  
向 selector 注册 连接 读写 事件
轮询 selector 中 的 selectKey集合
通过key找到对应的 channel ,通过绑定的buffer 进行读写


org.apache.tomcat.util.net.NioEndpoint NIO tailored thread pool, providing the following services: Socket acceptor thread Socket poller thread Worker threads pool tailored 量身定制的 LimitLatch Acceptor Poller SocketProcessor Excutor LimitLatch 维护连接计数,nio模式下默认10000,达到这个阈值后,拒绝连接请求 Acceptor 负责接收连接,默认由1个线程来执行,将连接请求注册到事件列表 Poller 轮询事件 ,Poller线程数 Math.min(2,Runtime.getRuntime().availableProcessors()) Poller将就绪的事件生成SocketProcessor,交给Excutor执行 SocketProcessor继承SocketProcessorBase,实现Runnable接口,可以提交给线程池Excutor 执行 doRun()方法,封装了读写Socket 完成Container调用逻辑 Excutor 是一个Tomcat线程池 ,用来执行Poller创建的SocketProcessor Excutor线程池的大小 Connector节点 maxThreads SocketProcessor 从socket中读取http request,解析成HttpServletRequest对象,分派到相应的servlet处理 然后将response通过socket发回client 从socket中读写数据时,并没有注册OP_READ或OP_WRITE事件到主Selector 而是直接通过socket完成读写,阻塞方式 在timeout控制上,使用NIO的Selector机制,该Selector并不是Poller线程维护的主Selector 而是BlockPoller线程中维护的Selector,称之为辅Selector 实现见org.apache.coyote.http11.Http11InputBuffer#fill
Reactor模型 Acceptor 负责accept事件 把接收到SocketChannel注册到Reactor池中的某个Reactor SocketChannel的所有IO事件由该Reactor处理 见 org.apache.tomcat.util.net.NioEndpoint.setSocketOptions(SocketChannel) 每个Acceptor和Reactor都持有一个Selector 每个Acceptor和Reactor都是一个线程 tomcat中Reactor池 就是 Poller池 private Poller[] pollers = null; public Poller getPoller0() { int idx = Math.abs(pollerRotater.incrementAndGet()) % pollers.length; return pollers[idx]; } org.apache.tomcat.util.net.NioEndpoint.Acceptor org.apache.tomcat.util.net.NioEndpoint.setSocketOptions(SocketChannel) getPoller0().register(channel); org.apache.tomcat.util.net.NioEndpoint.PollerEvent Poller线程的作用 将Acceptor接收到的请求注册到Poller的事件队列中 Poller轮询事件队列,处理到达的事件,将PollerEvent中的通道注册到Poller的Selector中 轮询已就绪的通道,对每个就绪通道创建一个SocketProcessor,交个Tomcat线程池处理
SocketProcessor SocketProcessor通过Http11ConnectionHandler,获取Htpp11Processor Htpp11Processor调用prepareRequest方法,准备好请求数据 然后调用CoyoteAdapter的service方法进行request和response的适配 之后交给容器进行处理 org.apache.catalina.connector.CoyoteAdapter.service(Request, Response) 将请求交给StandardEngineValue处理 请求交给Tomcat容器后,将请求一层一层传递到Engin Host Context Wrapper 最终经过一系列Filter,来到 Servlet
tomcat8 连接器 java nio 编程模型简介

上一篇     下一篇
mysql redo undo binlog

tomcat8 嵌入式 servlet 实例

tomcat8 连接器

tomcat8的后台线程

tomcat请求处理过程

tomcat nio 读写关键代码