tomcat源码解读(2)–容器责任链模式的实现

责任链模式:责任链模式可以用在这样的场景,当一个request过来的时候,需要对这个request做一系列的加工,使用责任链模式可以使每个加工组件化,减少耦合。也可以使用在当一个request过来的时候,需要找到合适的加工方式。当一个加工方式不适合这个request的时候,传递到下一个加工方法,该加工方式再尝试对request加工。

在tomcat中容器之间的调用使用的就是责任链的设计模式,当一个请求过来的时候首先是engine容器接受请求,然后engine容器会把请求传到host容器,host容器又会传到context容器,context容器传到wrapper容器,最后wrapper容器使用适配请求的servlet处理请求。tomcat实现容器间的责任传递主要涉及到这三个接口:Container,Pipeline,Valve.看下这三者的关系,以StandardEngine为例:

其中ContainerBase实现自Container,图中为了简洁没有标示出来。

valve中有三个关键的方法:

public Valve getNext();//返回下一个valve

public void setNext(Valve valve);//设置下一个valve

public void invoke(Request request, Response response)
 throws IOException, ServletException;//invoke为实际要执行的代码

Pipeline中有两个关键方法,getFirst()获取阀门链中第一个valve

public void addValve(Valve valve);//增加阀门

public Valve getFirst();//获取阀门链中第一个阀门

Container中有一个关键方法:

public Pipeline getPipeline();//获取一个阀门管道

当一个请求过来的时候,会调用StandardEngine中的getPipeline,然后依次执行其中valve;

初始开始的代码在CoyteAdapter的407行,如下:

connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);

connector.getService().getContainer()获得是的StandardEngine的实例。

假设最后要访问的servlet为TestServlet可以看到有如下调用。


    
    从StandardEngineValve中会一直调用到standardWrapperValve。tomcat的容器之间的调用就是通过这种方式来调用的。这样带来的好处就是,如果容器中需要新加一个阀门,只需要创建这个阀门,并且添加到pipeline中即可,不会影响到其他阀门代码,也不需要修改外部调用容器执行pipeline的代码

时间: 2024-10-10 16:33:23

tomcat源码解读(2)–容器责任链模式的实现的相关文章

Tomcat源码解读:我们发起的HTTP请求如何到达Servlet的

在上一节中,了解了Tomcat服务器启动的整个过程,现在来了解一下Tomcat如何接收到HTTP请求,并将请求送达至Servlet,Servlet处理后,响应信息又是如何返回给浏览器的呢?这两个问题是接下来要研究的课题,本节先研究第一个问题. 了解一点点网络知识的人,都会知道TCP连接通信是基于Socket的,上一节也有提到这点.通过上一节的说明,可以了解到Tomcat服务器在内部已经使用Endpoint类封装了Socket. 本篇会包含大量的源码解读说,由于篇幅原因,就将源码折叠起来,如果想了

Tomcat源码解读系列(一)——server.xml文件的配置

Tomcat是J2EE开发人员最常用到的开发工具,在Java Web应用的调试开发和实际部署中,我们都可以看到Tomcat的影子.大多数时候,我们可以将Tomcat当做一个黑盒来看待,只需要将编写的Java Web工程进行部署即可,但是,在遇到一些比较复杂难解决的问题时,如果我们了解了Tomcat的内部实现原理将会处理起来更得心应手更快地定位问题.另外,通过学习Tomcat的源码还可以更加深入地了解JEE规范,学习常见的设计模式.本系列的文章,将会介绍Tomcat的核心功能是如何实现的,一方面作

tomcat源码阅读之容器(Container)

一. 实现容器的接口是Container接口,Tomcat中共有四种类型的容器: 1.Engine:表示整个Catalina Servlet引擎: 2.Host:表示含有一个或者多个Context容器的虚拟主机,通常一个Engine下含有一个Host: 3.Context:表示一个web应用程序: 4.Wrapper :表示一个独立的Servlet: 二.Container接口的UML图: 三.Container接口: 1.容器管理相关:addChild, removeChild, findCh

Tomcat源码分析之—容器整体结构

Tomcat有多个容器组成,而Container也就是容器与Connecter连接器是Tomcat最核心的两个模块,Connecter连接器接收客户端的请求,并根据客户端的请求传递给Container处理并作出相应. Tomcat中有多个层次的容器对象:Engine.Host.Context.Wrapper,这些容器是有层级关系的. Engine:代表整个Tomcat的Servlet引擎,可以包含一个或多个子容器 Host:    表示一个虚拟主机,包含多个Context Context :表示

tomcat源码解读(1)–tomcat热部署实现原理

tomcat的热部署实现原理:tomcat启动的时候会有启动一个线程每隔一段时间会去判断应用中加载的类是否发生变法(类总数的变化,类的修改),如果发生了变化就会把应用的启动的线程停止掉,清除引用,并且把加载该应用的WebappClassLoader设为null,然后创建一个新的WebappClassLoader来重新加载应用. tomcat中热部署发现类变法之后要做的一系列停止工作的时序图如下: 上面时序图中只把关键的流转步骤画出来了,还有一些细节的处理没有完全画出来,这部分代码的继承的结构还是

Jfinal启动源码解读

本文对Jfinal的启动源码做解释说明. PS:Jfinal启动容器可基于Tomcat/Jetty等web容器启动,本文基于Jetty的启动方式做启动源码的解读和分析,tomcat类似. 入口  JFinalConfig的继承类的Main方法为入口,实例代码继承类为:DemoConfig,Main方法如下: public static void main(String[] args) { /** * 特别注意:Eclipse 之下建议的启动方式 */ JFinal.start("WebRoot&

Picasso源码分析(五):into方法追本溯源和责任链模式创建BitmapHunter

Picasso源码分析(一):单例模式.建造者模式.面向接口编程 Picasso源码分析(二):默认的下载器.缓存.线程池和转换器 Picasso源码分析(三):快照功能实现和HandlerThread的使用 Picasso源码分析(四):不变模式.建造者模式和Request的预处理 Picasso源码分析(五):into方法追本溯源和责任链模式创建BitmapHunter Picasso源码分析(六):BitmapHunter与请求结果的处理 Picasso异步加载图片流程回顾 首先通过wit

Spring源码解读之核心容器上节

Spring架构图 说明 Spring的流行程度就不用我来说了,相信大家如果使用JAVA开发就一定知道它.写这篇文章的初衷在于:1.了解Spring底层实现原理,提升对Spring的认识与理解.2.学习优秀框架编程实现,学习优秀的设计模式.3.使用Spring三年多,对于底层细节希望知道更多,便于求职. 对于Spring整个架构是很庞大的,很难一下看完和思考完,所以我会从Core Container进行切入,一步一步往上走,从而解开Spring神秘的底层面纱.同时对Spring的IOC\AOP\

NIO框架之MINA源码解析(三):底层通信与责任链模式应用

本文主要介绍下在mina中责任链模式的应用以及mina对于数据读写的处理. 在mina中,对数据的读操作是在processor类里面触发的,收到新消息后就触发读数据链去处理新消息直到自己的业务逻辑代码(IoHandler). 在mina中,数据的写(write)和发(send)差别相对较大,mina中的写消息最终的结果只是把要写的消息经过写数据链处理后的最终结果放在了一个缓存中,并把当前session标记为可发. 数据的发送就是传统中我们所说的发消息,就是把写消息最终处理的结果发送到客户端,待发