tomcat请求处理过程
所属分类 tomcat
浏览量 912
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上传文件