首页 > 其他 > 详细

责任链模式之——Pipeline-Valve 管道(Tomcat)分析及仿写

时间:2020-09-17 09:34:09      阅读:157      评论:0      收藏:0      [点我收藏+]

1. Pipeline-Valve 管道(Tomcat)简介

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

Tomcat 中的 Pipeline-Valve 实际上就是责任链模式,责任链模式是指在一个请求处理的过程中有多个处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完成后将处理后的请求返回,再让下一个处理者继续处理,就好像驾车的过程中可能会遇到很多次交警检查,可能有查酒驾的也可能有查违章的,在一次驾车的过程中可能会遇到多次检查,这就是责任链模式,Pipeline 就相当于驾车的过程, Valve 相当于检查的交警。 

不过Pipeline-Valve 的管道模型和普通的责任链模式稍微有点不同,区别主要有两点:

  • 每个Pipeline 都有特定的Value ,而且是在管道的最后一个执行,这个Valve 叫BaseValve,BaseValve 是不可删除的;
  • 在上层容器的管道的BaseValue 中会调用下层容器的管道。4 个容器的BaseValve 分别是StandardEngineValve 、StandardHostValve 、StandardContextValve 和StandardWrapperValve,整个处理的流程如下图: 

技术分享图片

下面代码即为实现了Value接口的基础类ValveBase,它有一个Value类型的内部属性next,即同一个Pipeline中的后续Valve的引用。类似于单向链表。继承这个ValveBase针对不同的容器实现了不同版本的阀如StandardEngineValve,StandardHostValve,StandardContextValve,StandardWrapperValve等。他们之间不同的实现就是invoke和event的方法不同。而实际上也就是请求的路由选择,Filter应用和Servlet的处理。

public abstract class ValveBase extends LifecycleMBeanBase
    implements Contained, Valve
{
    /**
     * The next Valve in the pipeline this Valve is a component of.
     */
    protected Valve next = null;
 
    @Override
    public Container getContainer() {
 
        return (container);
 
    }
 
    @Override
    public void setContainer(Container container) {
 
        this.container = container;
 
    }
 
    @Override
    public Valve getNext()
    {
        return (next);
    }
 
    @Override
    public void setNext(Valve valve)
    {
        this.next = valve;
    }
 
    @Override
    public abstract void invoke(Request request, Response response)
        throws IOException, ServletException;
 
    @Override
    public void event(Request request, Response response, CometEvent event)
        throws IOException, ServletException {
        // Perform the request
        getNext().event(request, response, event);
    }
}

2. Pipeline-Valve责任链设计

 

责任链模式之——Pipeline-Valve 管道(Tomcat)分析及仿写

原文:https://www.cnblogs.com/zjfjava/p/13676540.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!