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

系统 1706 0

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

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

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

    其中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可以看到有如下调用。
 

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

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论