How Tomcat works — 六、tomcat处理请求

tomcat已经启动完成了,那么是怎么处理请求的呢?怎么到了我们所写的servlet的呢?

目录

  • Http11ConnectionHandler
  • Http11Processor
  • CoyoteAdapter
  • StandardEngineValve
  • StandardWrapperValve
  • 总结

Http11ConnectionHandler

在tomcat 启动之后会使用socket.accept接收请求,接收到之后会调用自己的processSocket来处理请求,在该方法中启动一个SocketProcessor线程,在该内部类的润方法内调用Http11ConnectionHandler.process,过程如下:

实际执行的是超类AbstractConnectionHandler.process方法,主要作用:

  • 从connections里面获取processor
  • 如果processor为null则尝试从队列里面获取一个processor,该队列是一个RecycledProcessors类继承自ConcurrentLinkedQueue,是一个线程安全的队列,因为同时会有多个线程获取processor
  • 如果processor还是为null(表明还未创建或者已经用完),那么创建一个新的processor,调用Http11ConnectionHandler.createProcessor,该方法会创建一个新的Http11Processor(但是并不会立即添加到上面提到的队列里面,而是在请求处理完成之后才会添加到队列里面)
  • 调用Http11Processor.process

Http11Processor

在connector出来完成之后会启动processor线程,关于processor的类图如下:

和处理协议一 一对应,不同的协议也有不同的processor,在AbstractProcessor里面有Request和Response,不过是org.apache.coyote包下面的,这是在connector层面的连接器,是primitive的。

实际执行的也是超类AbstractHttp11Processor.process,主要功能如下:

  • 获得socket的输入、输出流
  • parsing request header、method、requestURI
  • 设置request filters,并设置content-length等header
  • 调用CoyoteAdapter.service

CoyoteAdapter

由connector和processor过渡到container的类,使用了adapter模式,将container适配到processor。主要的方法就是CoyoteAdapter.service:

  • 获取org.apache.connector.Request和Response,这两个类经过facade模式之后就是最后我们servlet中使用的request和response
  • 如果是新建的processor,request和response为null,那么就调用connector.createRequest和createResponse新建,然后设置到coyote.request的note中
  • 调用postParseRequest,添加wrapper和servlet之间的映射(在后面load servlet的时候用到),parseSessionId解析sessionId
  • connector.getService().getContainer().getPipeline().getFirst().invoke(request, response),依次是:Connector,StandardService,StandardEngine,StandardPipeline,StandardEngineValve
  • 在执行完之后,完成请求也在这个方法中:request.finishRequest(上面说过的processor就是在这儿回收的),response.finishResponse(请求在这里返回到客户端,outputStream)
  • 最后,recycle request和response,清空request和response所有信息

StandardEngineValve

这个是StandardEngine的基础阀(每个容器都有一个pipeline,每个pipeline都有一个基础阀,用来调用servlet)在adapter中最后调用到了StandardEngineValve.invoke方法,该方法主要进行了以下操作

  • request.getHost:获取host
  • host.getPipeline().getFirst().invoke(request, response):依次是StandardHost,StandardPipeline,StandardHostValve

接下来就是容器逐级依次调用,下一个是StandardHostValve:

context.getPipeline().getFirst().invoke(request, response);

在接下来是NonloginAuthencator

context.invokeNext(request,response)

接着是StandardContextValve

 wrapper.getPipeline().getFirst().invoke(request, response);

接下来就是StandardWrapperValve,在这里进行了很多工作。

StandardWrapperValve

这是StandardWrapper的基础阀,作用就是获取servlet实例并调用filterChain,主要方法是invoke:

  • 获取容器wrapper,通过wrapper分配一个servlet实例
  • 使用ApplicationFilterFactory创建filterChain
  • filterChain.doFilter调用filter链,这里没有配置额外的filter,只有一个默认的WsFilter(对websocket的支持),在所有的filterChain调用完成之后,就是调用servlet.service 方法,开始进入我们写的servlet里面
  • 在上面调用完成之后,释放filterChain(将filter置空),释放servlet(会受到instantPool里面)

这个执行流程如上,最后一个UserServlet是我自定义的简单的servlet。到了自定义的servlet之后,依次请求也就是到了最深层,接下来就是逐层范返回,并做一些清理工作(当然了还有一些长连接的维护等等)。

总结

从socket监听接收开始,到我们自定义的servlet处理请求结束,是一次完整的请求过程,为了说明白请求的整个过程,省略了很多细节,比如:三种request(coyote.Request,connector.Request,RequestFacade)之间的转换,session的管理等等。

时间: 2024-11-05 01:43:56

How Tomcat works — 六、tomcat处理请求的相关文章

How Tomcat Works 2

上一节(How Tomcat Works 1 编写一个简单静态web服务器)编写了一个简单的web服务器,只能处理静态的资源,本节将继续向前迈出一个小步,创建两个不同的servlet容器,能够利用servlet简单的处理动态内容.注意每节的代码都是基于上一节的继续丰富,因此有必要从第一节开始看起. 在编写代码之前,需要先大体了解一下Servlet是什么,方便后面的理解,下面就是一个最简单的Servlet什么也没做: package prymont; import java.io.IOExcept

how tomcat works 读书笔记四 tomcat的默认连接器

其实在第三章,就已经有了连接器的样子了,不过那只是一个学习工具,在这一章我们会开始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足以下几个要求 1 实现org.apache.cataline.Connector接口 2 负责创建实现了org.apache.cataline.Request接口的request对象 3 负责创建实现了org.apache.cataline.Response接口的response对象 这里默认的连接器的原理很简单,就是等待http请求,创建re

《How Tomcat Works》读书笔记(二)

<How Tomcat Works>读书笔记(二) 这是<How Tomcat Works>第一二章的读书笔记.第一张主要写了一个静态资源处理的web服务器,第二章加了对servlet的处理. 1. 概述 1.1 架构 HttpServer:表示Http服务器,与客户端通信,处理Http请求. StaticResourceProcessor:对静态资源请求进行处理. ServletProcessor:对Servlet资源请求进行处理. Request:表示Http请求,实现了Ser

how tomcat works 读书笔记(二)----------一个简单的servlet容器

app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/article/details/39378157) 回顾我们上一章,我们开发了一个最最简单的web服务器,它可以使用户访问服务器内的静态资源.当然这是远远不够的,在这一节里,我们就试着让服务器在能相应静态资源的基础上继续支持servlet. servlet接口 javax.servlet.Servlet接口

读了两章的 How Tomcat Works

周一发现了一本书.How Tomcat Works 惯例先到豆瓣搜书评.结果书评出奇的好.然后下载了PDF.从简介中看,本书的每个章节都会不断的围绕怎么建造一个Tomcat讲解.我本人比较喜欢这种造轮子的书.原因很简单,比较笨.如果书中没有代码,很难从脑海中构件代码结构.可是万万没想到,看到第三章,就发现,书中的代码不全,完整的代码还要到GitHub下载.无奈只能放下这本好书.(个人觉得看书就是要了解本质,如果书中的源码不全,而是给出片段,剩下的还要到项目中找,我觉得你还不如让我去直接看Tomc

How Tomcat works — 四、tomcat启动(3)

上一节说到StandardService负责启动其子组件:container和connector,不过注意,是有先后顺序的,先启动container,再启动connector,这一节先来看看container. 目录 Pipeline和Vavle StandardEngine类和StandardHost类 StandardContext类 总结 Pipeline和Vavle 在第二节(How Tomcat works — 二.tomcat启动(1))中没有介绍关于Pipeline和Vavle,因

Tomcat Server处理一个HTTP请求的过程(转)

Tomcat Server处理一个HTTP请求的过程 1.用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得. 2.Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应. 3.Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host. 4.Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被

how tomcat works

目标 深入剖析tomcat •Java Web 服务性能优化实践2014-11-04阅读225 •How Tomcat work之第十五章之Digester之setting property2014-07-30阅读253 •How Tomcat work 之第十四章之server and services 之application2014-07-29阅读194 •how tomcat work之第十四章:server and service2014-07-27阅读352 •How Tomcat

TOMCAT原理详解及请求过程

Tomcat: Tomcat是一个JSP/Servlet容器.其作为Servlet容器,有三种工作模式:独立的Servlet容器.进程内的Servlet容器和进程外的Servlet容器. Tomcat目录: tomcat |---bin:存放启动和关闭tomcat脚本 |---conf:存放不同的配置文件(server.xml和web.xml): |---doc:存放Tomcat文档: |---lib/japser/common:存放Tomcat运行需要的库文件(JARS): |---logs: