Pipeline-Value通道


       Container处理请求是使用Pipeline-Value通道来处理的。

Pipeline-Value处理模式


       Pipeline-Value是责任链模式,责任链模式是指在处理一个请求的过程中有多个处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完成后将处理后的请求返回,再让下一个处理者继续处理,Pipeline是请求处理的过程,Value是过程中的处理者。

       Pipeline-Value与普通的责任链模式有一些区别:
- 每个Pipeline有特定的Value,而且在管道最后一个执行,这个Value叫BaseValue,不可删除
- 在上层容器的管道的BaseValue会调用下层容器的管道


       四个容器的BaseValue分别是StandardEngineValue、StandardHostValue、StandardContextValue和StandardWrapperValue,处理流程如下:

Pipeline-Value通道

       在Engine管道中依次执行Engine的各个Value,最后执行StandardEngineValue,然后再执行Host、Context、Wrapper的Value。


       在Filter中用到的FilterChain就是这种模式,FilterChain相当于Pipeline,每个Filter相当于一个Value,Servlet相当于最后一个BaseValue。

Pipeline-Value的实现方法

pipeline通道的实现分为生命周期管理和处理请求两部分

Pipeline管道生命周期的实现方法


       Container的pipeline在抽象实现类ContainerBase中定义,并在生命周期的startInternal、stopInternal、destoryInternal方法中调用管道的相应生命周期方法。

       Container的四个子容器都继承自ContainerBase,所以四个容器在执行生命周期的方法是都会调用管道相应的生命周期方法。

       Pipeline使用的是StandardPipeline类型,它里面的Value保存在first属性中,Value是链式结构,通过getNext获取每个Value。

Pipeline管道处理请求的实现方法


       Pipeline调用所包含的Value的invoke方法处理请求,并在BaseValue中调用子容器Pipeline所包含的Value的invoke方法,直到最后调用StandardWrapperValue。

       Connector在接收到请求后会调用最顶层的Pipeline来处理,顶层容器的Pipeline处理完成后会在BaseValue里调用下一层的Pipeline处理,这样逐层调用所有的Pipeline处理。最后的StandardWrapperValue中会创建FilterChain并调用doFilter来处理请求,然后依次调用Filter的doFilter和Servlet的service处理其扭曲。