webx学习(七)Pipeline服务

前端之家收集整理的这篇文章主要介绍了webx学习(七)Pipeline服务前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Pipeline的意思是管道,管道中有许多阀门(Valve),阀门可以控制水流的走向。在Webx中,pipeline的作用就是控制应用程序流程的走向。

Pipeline工作原理


看到上图我们可能会很熟悉,很想filter的流程方式,也是击鼓传花式的流程控制。但是有几点不同:
Pipeline只能控制流程,不能改变request和response。
Pipeline是轻量级组件,它甚至不依赖于WEB环境。Pipeline既可以在程序中直接装配,也可以由spring和schema来配置。
Pipeline支持更复杂的流程结构,例如:子流程、条件分支、循环等

一个典型的Webx应用的pipeline配置文件(pipeline.xml)
<?xml version= "1.0" encoding= "UTF-8" ?>
xsi:schemaLocation="
http: //www.alibaba.com/schema/services
http: //localhost:8080/schema/services.xsd
http: //www.alibaba.com/schema/services/pipeline/conditions
http: //localhost:8080/schema/services-pipeline-conditions.xsd
http: //www.alibaba.com/schema/services/pipeline/valves
http: //localhost:8080/schema/services-pipeline-valves.xsd
http: //www.springframework.org/schema/beans
http: //localhost:8080/schema/www.springframework.org/schema/beans/spring-beans.xsd
">
<!-- 初始化turbine rundata,并在pipelineContext中设置可能会用到的对象(如rundata、utils),以便valve取得。 -->
<prepareForturbine />
<!-- 设置日志系统的上下文,支持把当前请求的详情打印在日志中。 -->
<setLoggingContext />
<!-- 分析URL,取得target。 -->
<analyzeURL homepage= "homepage" />
<!-- 检查csrf token,防止csrf攻击和重复提交。 -->
<checkCsrfToken />
<loop>
<choose>
<when>
<!-- 执行带模板的screen,默认有layout。 -->
<pl-conditions:target-extension-condition extension= "null,vm,jsp" />
<performAction />
<performTemplateScreen />
<renderTemplate />
</when>
<when>
<!-- 执行不带模板的screen,默认无layout。 -->
<pl-conditions:target-extension-condition extension= "do" />
<performAction />
<performScreen />
</when>
<otherwise>
<!-- 将控制交还给servlet engine。 -->
<exit />
</otherwise>
</choose>
<!-- 假如rundata.setRedirectTarget()被设置,则循环,否则退出循环。 -->
<breakUnlessTargetRedirected />
</loop>
</services:pipeline>
</beans:beans>

无条件循环 - <loop>

例 6.17. 无条件循环

<services:pipeline>
<loop loopCounterName="count" maxLoopCount="10">
<valve />
<break-if test="..." />
</loop>
</services:pipeline>

定义循环变量loopCounterName,这个变量值将被保存在PipelineContext中,且可被其它的valve所访问。

定义maxLoopCount=10最大循环圈数,以避免循环失控。

无条件循环一定要和<break>、<break-if>或<break-unless>等valve相配合。
条件循环 - <while>

例 6.18. 条件循环

<services:pipeline>
<while loopCounterName="count" test="count <= 2">
<valve />
</while>

<while maxLoopCount="10">
<conditions:condition class="..." />
<valve />
</while>
</services:pipeline>

定义循环变量loopCounterName,这个变量值将被保存在PipelineContext中,且可被其它的valve所访问。

通过判断循环变量“count <= 2”,循环2次。

定义maxLoopCount=10,以避免循环失控。

可以自定义任意条件。
单条件分支 - <if>

例 6.19. 单条件分支

<services:pipeline>
<if test="1 == 2">
<valve />
</if>

<if>
<conditions:condition class="..." />
<valve />
</if>
</services:pipeline>

JEXL条件表达式。

自定义任意条件。
多条件分支 - <choose><when><otherwise>

例 6.20. 多条件分支

<services:pipeline>
<choose>
<when test="1 == 2">
<valve />
</when>
<when>
<conditions:condition class="..." />
<valve />
</when>
<otherwise>
<valve />
</otherwise>
</choose>
</services:pipeline>

条件分支1,用JEXL表达式来判断。

条件分支2,用任意条件判断

分支3,当所有条件均不符合时,选择该分支。
无条件中断 - <break>

例 6.21. 无条件中断

<services:pipeline>
<loop>
<valve />
<break />
<valve />
</loop>

<loop>
<valve />
<loop>
<break levels="1" />
</loop>
<valve />
</loop>

<loop label="MY_LOOP">
<valve />
<loop>
<break toLabel="MY_LOOP" />
</loop>
<valve />
</loop>
</services:pipeline>

无条件中止当前的pipeline(即loop循环)。

无条件中止上一层(levels=1)的pipeline(即loop循环)。

无条件中止指定label的pipeline(即loop循环)。
有条件中断 - <break-if>、<break-unless>

有条件中断是<break>和<if>的组合。

例 6.22. 有条件中断

<services:pipeline>
<loop loopCounterName="count">
<valve />
<break-if test="count > 2" />
<valve />
</loop>

<loop label="MY_LOOP">
<valve />
<break-if toLabel="MY_LOOP">
<conditions:condition class="..." />
</break-if>
<valve />
</loop>

<loop loopCounterName="count">
<valve />
<break-unless test="count <= 2" />
<valve />
</loop>
</services:pipeline>

当count>2时中断。

<break-if>和<break-unless>均支持和<break>类似的其它选项:levels和toLabel。

和<if>类似,也支持任意condition。

<break-unless>和<break-if>的条件相反:除非count<=2,否则中断。
无条件退出整个pipeline - <exit>

退出整个pipeline,意思是结束所有的嵌套层次。

例 6.23. 无条件退出整个pipeline

<services:pipeline>
<loop>
<valve />
<loop>
<exit />
</loop>
<valve />
</loop>
</services:pipeline>

对于Webx而言,<exit>还有一层特殊的含义:放弃WebxFrameworkFilter的控制权,把它交还给servlet engine。以URL http://localhost:8081/myapp/myimage.jpg为例,把控制权交还给servlet engine,意味着让servlet engine去显示myapp应用目录下的静态图片:myimage.jpg。
异常捕获和finally处理 - <try-catch-finally>

类似Java中的try/catch/finally结构。

例 6.24. 异常捕获和finally处理

<services:pipeline>
<try-catch-finally>
<try>
<valve />
</try>
<catch exceptionName="myexception">
<valve />
</catch>
<finally>
<valve />
</finally>
</try-catch-finally>
</services:pipeline>

<catch>标签可以将捕获的异常以指定名称保存在PipelineContext中,以便其它valve取得。
创建子流程 - <sub-pipeline>

单纯使用这个valve,对执行结果不会有任何影响。但可用来对较长的pipeline进行分段管理。

例 6.25. 创建子流程

<services:pipeline> <valve /> <sub-pipeline label="mylabel"> <valve /> </sub-pipeline> <valve /> </services:pipeline>

猜你在找的设计模式相关文章