1. 并行网关定义
-
一个流程中流程实例只有一个,执行实例可以有多个;
-
并行网关的功能是基于进入和外出的顺序流提供的;
-
分支:
- 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支;
-
汇聚:
- 所有到达并行网关,在此等待的进入分支,知道所有进入顺序流的分支都到达以后,流程就会通过汇聚网关。
-
并行网关的进入和外出都是使用相同的节点标识;
-
如果同一个并行网关有多个进入和多个外出顺序流,它就同时具有分支和汇聚功能。这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
-
并行网关不会解析条件,即使顺序流中定义了条件,也会被忽略。
-
并行网关不需要是“平衡”的(比如,对应并行网关的进入和外出节点数目不一定相等)。
注意:每条并行的线路,到达汇聚网关后,都会增加一次网关的活动实例,即在表
act_hi_actinst
生成一条ACT_NAME_
为汇聚网关名的条目,该条目的执行实例 ID 是这条执行完成的线路的执行实例 ID,其意义在于记录这条线路的完成时间。
2. 示例演示:
模型如图:
- 流程实例执行到并行网关1,执行实例和流程实例 ID 都为 52552;
- 经过并行网关1拆分后,分支为两个执行实例,执行实例分别为:52555 和 52556;
- 我们让上面的那个执行实例先走,到了网关 1_1 后,执行实例 52555 被网关 1_1 继续分解为两个执行实例:52555 和 52572 。
- 完成任务 1_1 后,查看表
act_ru_execution
:
可以看出,即使到达了网关,任务 1_1 的执行实例还没有结束,在网关 1_2 等待任务 1_2 的执行实例结束之后汇聚。
- 完成任务 1_2 后,表
act_ru_execution
:
可以看出,执行实例 52555 和执行实例 52572 汇聚后,变回了执行实例 52555。
- 继续完成“线路1经过汇聚后的任务”,表
act_ru_execution
:
执行实例 52555 再次在网关2进入了等待状态;
- 完成执行实例 52556 的所有任务后,流程实例运行完毕。先来看看表
act_hi_taskinst
:
蓝色部分不用管,是之前的实例;
根据表中的字段 EXECUTION_ID_
我们就可以分析出流程实例如下的拆合过程:
用一个表可以完美诠释该流程:
阶段 | 拆分情况 | 流程实例ID | 执行实例ID |
---|---|---|---|
1. 到达网关1之前 | 无 | 52552 | 52552 |
2. 到达网关1之后(分支) | 线路1 | 52552 | 52555 |
线路2 | 52552 | 52556 | |
3. 到达网关1_1之后(分支) | 线路1_1 | 52552 | 52555 |
线路1_2 | 52552 | 52572 | |
线路2 | 52552 | 52556 | |
4. 到达网关1_2之后(汇聚) | 线路1 | 52552 | 52555 |
线路2 | 52552 | 52556 | |
5. 到达网关2之后(汇聚) | 无 | 52552 | 52552 |
3. 总结
- 流程实例被并行网关拆分后,几个分支的执行实例 ID 是重新定义的,流程实例在
act_ru_execution
表中被定格在并行网关处,即字段ACT_ID_
一直都是并行网关; - 执行实例被并行网关拆分后,分支中的一个分支执行实例的 ID 等于拆分前的执行实例 ID ,其他分支执行实例 ID 重新定义;
- 执行实例被合并后,合并后的执行实例 ID 等于拆分前的执行实例 ID。