Flowable入门系列文章40 - 网关 02
Posted 分享牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flowable入门系列文章40 - 网关 02相关的知识,希望对你有一定的参考价值。
1、包含网关
描述
该包容网关可以被看作是排他性的组合和平行网关。与独占网关一样,您可以定义出站顺序流的条件,包含的网关将对其进行评估。但主要区别在于包容性网关可以采用多个序列流,如并行网关。
内含网关的功能基于输入和输出顺序流程:
- fork:评估所有输出顺序流条件,并且对于评估为true的顺序流条件,并行跟随流,为每个顺序流创建一个并发执行。
- 连接:到达包含网关的所有并发执行在网关处等待,直到具有进程令牌的每个传入序列流到达执行为止。这是与并行网关的重要区别。所以,换句话说,包含性网关只会等待将要执行的传入序列流。加入后,该过程继续经过加入的包含网关。
请注意,如果同一包容性网关有多个入站和出站序列流,则包含网关可以具有分叉和加入行为。在这种情况下,网关将首先加入所有具有进
程标记的传入序列流,然后再分离为具有计算结果为真的条件的传出序列流的多个并发执行路径。
图形表示法
一个包容性的网关被视为一个网关(菱形),里面有圆圈符号。
XML表示
定义一个包容性的网关需要一行XML:
<inclusiveGateway id="myInclusiveGateway" />
实际行为(分叉,连接或两者)由连接到包含网关的序列流定义。
例如,上面的模型归结为以下XML:
<startEvent id="theStart" />
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="fork" />
<inclusiveGateway id="fork" />
<sequenceFlow sourceRef="fork" targetRef="receivePayment" >
<conditionExpression xsi:type="tFormalExpression">${paymentReceived == false}</conditionExpression>
</sequenceFlow>
<sequenceFlow sourceRef="fork" targetRef="shipOrder" >
<conditionExpression xsi:type="tFormalExpression">${shipOrder == true}</conditionExpression>
</sequenceFlow>
<userTask id="receivePayment" name="Receive Payment" />
<sequenceFlow sourceRef="receivePayment" targetRef="join" />
<userTask id="shipOrder" name="Ship Order" />
<sequenceFlow sourceRef="shipOrder" targetRef="join" />
<inclusiveGateway id="join" />
<sequenceFlow sourceRef="join" targetRef="archiveOrder" />
<userTask id="archiveOrder" name="Archive Order" />
<sequenceFlow sourceRef="archiveOrder" targetRef="theEnd" />
<endEvent id="theEnd" />
在上面的示例中,流程启动后,如果流程变量paymentReceived == false和shipOrder == true,则将创建两个任务。如果这些过程变量中只有一个等于true,则只会创建一个任务。如果没有条件评估为真,则抛出异常。这可以通过指定一个默认的传出序列流来防止。在以下示例中,将创建一个任务,发货任务:
HashMap<String, Object> variableMap = new HashMap<String, Object>();
variableMap.put("receivedPayment", true);
variableMap.put("shipOrder", true);
ProcessInstance pi = runtimeService.startProcessInstanceByKey("forkJoin");
TaskQuery query = taskService.createTaskQuery()
.processInstanceId(pi.getId())
.orderByTaskName()
.asc();
List<Task> tasks = query.list();
assertEquals(1, tasks.size());
Task task = tasks.get(0);
assertEquals("Ship Order", task.getName());
完成此任务后,第二个包含网关将加入两个执行,并且由于只有一个传出序列流,因此不会创建并发执行路径,只有存档顺序任务处于活动状态。
请注意,包容性网关不需要平衡(相应包含网关的输入/输出序列流的匹配数量)。包容性网关将简单地等待所有传入的序列流,并为每个传出序列流创建并行执行路径,而不受流程模型中其他构造的影响。
上面文章来自盘古BPM研究院:http://vue.pangubpm.com/
文章翻译提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以关注微信公众号:
以上是关于Flowable入门系列文章40 - 网关 02的主要内容,如果未能解决你的问题,请参考以下文章
Flowable入门系列文章79 - 流动设计器BPMN功能