首页  

tomcat请求处理过程     所属分类 tomcat 浏览量 147
Acceptor NioChannel PollEvent Poller Worker SocketProcessor

Connector

Acceptor 线程  用于接受新连接,选择一个 Poller ,将新连接添加到 Poller 的事件队列中
Poller   线程    Socket读写  
worker 线程  请求处理,创建 Request 对象,调用容器的 pipeline 进行处理

NioEndpoint 中维护  Acceptor Poller worker  线程
 
 
org.apache.tomcat.util.net.NioEndpoint.bind()
 
ServerSocketChannel serverSock = ServerSocketChannel.open();
acceptorThreadCount
pollerThreadCount 
createExecutor()  Worker 线程池
Connector 配置 minSpareThreads  maxThreads

Acceptor   ServerSocketChannel.accept() 阻塞
新连接到达时,返回一个 SocketChannel

配置完 Socket 后 封装到 NioChannel 中,并注册到 Poller
NioEndpoint 维护一个 Poller 数组 ,轮询分配
addEvent()将 Socket 添加到该 Poller 的 PollerEvent 队列中


所有的 Poller 共用一个 Selector,实现类 sun.nio.ch.EPollSelectorImpl

events() 方法通过 addEvent() 方法添加到事件队列中的 Socket 注册到 EPollSelectorImpl
Socket 可读时,Poller 对其进行处理
createSocketProcessor() 方法将 Socket 封装到 SocketProcessor 中

execute(SocketProcessor) 方法将 SocketProcessor 提交到线程池


createProcessor() 创建一个 Http11Processor,  将 Socket 中的内容封装到 Request 中
org.apache.coyote.Request

postParseRequest() 处理 Request ,映射处理
从 URL 映射到相应的 Host Context Wrapper 

CoyoteAdapter 将 org.apache.coyote.Request 封装到 org.apache.catalina.connector.Request
传递给 Container 处理

connector.getService().getMapper().map() 查询 URL 映射关系

connector.getService().getContainer().getPipeline().getFirst().invoke() 
将请求传递到 Container 处理

request.getHost().getPipeline().getFirst().invoke() 
获取对应的 StandardHost 并执行其 pipeline

request.getContext().getPipeline().getFirst().invoke() 
获取对应的 StandardContext 并执行其 pipeline

request.getWrapper().getPipeline().getFirst().invoke() 
获取对应的 StandardWrapper 并执行其 pipeline

allocate() 用来加载并初始化 Servlet

createFilterChain() 从 StandardContext 获取所有的过滤器
然后将匹配 过滤器添加到 filterChain 中

doFilter() 执行过滤链, 过滤器执行完毕后调用 Servlet service() 方法

上一篇     下一篇
tomcat8 连接器

Tomcat NIO 处理机制

tomcat8的后台线程

tomcat nio 读写关键代码

springboot2动态设置日志级别

postman上传文件