顺序流
本文中内容和案例节选自贺波老师的《深入Activiti流程引擎:核心原理与高阶实战》一书。这本书中的内容更为全面、详尽,对系统学习和深入掌握Activiti/Flowable的用法非常有帮助,推荐给大家。
QQ交流群1:
633168411已满
QQ交流群2: 582010059
顺序流是一端带有箭头的实线,可在流程图中连接流程内的各个元素,并显示各个元素的执行顺序。
Flowable 支持的顺序流有:
- 标准顺序流
- 条件顺序流
- 默认顺序流
标准顺序流
定义
顺序流是 BPMN2 规范中的流程定义元素,是连接两个流程节点的连线。顺序流可以在编排流 程时控制流程的执行顺序,流程执行完一个节点后,会沿着节点的所有外出顺序流继续执行。顺序 流在 BPMN 2.0 中默认的行为是并发的:多个外出顺序流会创造多个单独的,并发流程分支。
图形标记
标准顺序流表示为一条带有箭头的实线,从起点指向终点,如图所示:
XML内容
顺序流需要流程范围内唯一的 id,以及对起点与终点元素的引用。每个顺序流都有一个源头和 一个目标引用,包含了活动、事件或网关。
<sequenceFlow id="testSequenceFlow" name="标准顺序流" sourceRef="sourceNodeId"
targetRef="targetNodeId" />
其中,sourceRef 属性值为起点元素的 id,targetRef 属性值为终点元素的 id。name 属性可以理 解为顺序流的注释,将会在流程图上显示出来,注释可以让流程路线更直观和易于识别,注释不参 与到引擎规则判断中。
使用示例
条件顺序流
定义
顾名思义,条件顺序流需要满足一定的条件才能被执行。从网关(Gateway)、活动(Activity)、 事件(Event)的离开的顺序流,允许为它设定规则条件,引擎在执行网关、活动的后继拆分路线 时,将通过评估条件的连线作为选择路径。在标准顺序流上设置一个 condition 表达式来决定下一 步流出的目标,就构成了一个条件顺序流,当流程离开一个节点时,流程引擎会计算其每个出口顺 序流上的条件,只有当 condition 条件结果为 true 时,选择该出口顺序流。当多条顺序流被选中时, 就会创建多条分支,流程会继续以并行方式继续执行。
图形标记
条件顺序流显示为在一个正常的顺序流的起点上加了一个菱形,条件表达式也会显示在顺序流 上,如图所示:
XML内容
<sequenceFlow id="Flow_0acsf96" sourceRef="Gateway_0cvg5ta" targetRef="Activity_185hcl7">
<conditionExpression xsi:type="tFormalExpression">${flag}</conditionExpression>
</sequenceFlow>
由于目前 Flowable 只支持 tFormalExpressions,所以必须把 xsi:type="tFormalExpression"添加到 conditionExpression 中。条件表达式放在${}之间,只能使用 UEL(Unified Expression Language,统 一表达式语言,java EE6 规范的一部分),表达式的计算结果需要返回 boolean 值,否则会在解析 表达式时抛出异常。 Flowable支持两种 UEL表达式:UEL-value(value expression)和 UEL-method(method expression)。 UEL-value 解析为值,默认所有流程变量都可以在表达式中使用,所有 spring bean(spring 环 境中)也可以使用在表达式中,比如${startUser}、${**Bean.**Property}。 UEL-method 用于调用一个方法,可以传参数也可以不传参数。传递的参数可以是字符串也可 以是表达式,它们会被自动解析。当调用一个无参数的方法时,记得在方法名后添加空的括号。比 如:${startUserBean.getStartUser()}、${humanService.getDirectLeader(currentUser)}。
界面操作
默认顺序流
定义
在 BPMN2 规范中,所有的任务和网关都可以设置一个默认顺序流。只有在节点的其他外出顺 序流的条件都不满足时,引擎会选择默认顺序流作为外出顺序流继续执行。默认顺序流的条件设置 不会生效。
图形标记
默认顺序流显示为了普通顺序流,起点有一个“斜线”标记,如图所示。
XML内容
<exclusiveGateway id="Gateway_1gse3sj" default="Flow_1xda65r">
<incoming>Flow_0ovx8ag</incoming>
<outgoing>Flow_1xda65r</outgoing>
<outgoing>Flow_071i0y1</outgoing>
</exclusiveGateway>