嵌入式子流程是一个包含其他活动、网关、事件的流程。它自身表现为一个跟大的流程的一部分。嵌入式子流程定义在父流程的内部,这也是为啥被叫做嵌入式子流程。

子流程有两个主要使用场景: 1.子流程允许分层建模。很多的建模工具允许折叠子流程,隐藏子流程的细节,只展示更高级的端到端的业务流程概览。 2.子流程会为事件创建一个新的作用域。在子流程执行期间抛出的事件可以被子流程的边界事件捕获,新的作用域对子流程增加了一个限制。

使用子流程有一些限制: 1.嵌套子流程只能有一个空开始事件(none start event),其他类型的开始事件不被允许。子流程必须由最少一个结束事件(end event)。BPMN2.0的规范允许省略子流程的开始和结束事件,但是当前的流程引擎还不支持。 2.流程序列不能跨越子流程边界。

子流程被可视化为一个典型的活动,即一个圆角矩形。如果子流程被折叠,则只显示名称和加号,给出流程的高级概览。

img

如果子流程展开了,子流程的步骤会展示在子流程的边界内。

img

使用子流程的主要原因是为事件定义了一个作用域。下面的流程展示了这个作用:如果我们被邀请去吃晚餐,我们就会取消我们的做饭流程。然而,如果我们已经吃过了,我们就不会再接手邀请。更技术的术语讲,消息事件的作用域是子流程,所以只有在子流程是活跃的时候,消息才能被接收。

子流程通过子流程元素定义。所有的活动、网关、事件等等,作为子流程的部分,都需要被包含在这个元素内。

<startEvent id="outerStartEvent" />
<!-- ... other elements ... -->
<subProcess id="subProcess">
  <startEvent id="subProcessStart" />
  <!-- ... other subprocess elements ... -->
  <endEvent id="subProcessEnd" />
</subProcess>

世间山河广,祝你得偿所愿!