目录
- 定义
- 图形标记
- XML内容
- 使用示例
- 视频讲解
定义
内嵌子流程又叫嵌入式子流程,它是一个可以包含其它活动、分支、事件,等的活动。我们通
常意义上说的子流程通常就是指的内嵌子流程,它表现为将一个流程(子流程)定义在另一个流程
(父流程)的内部,子流程作为父流程的一部分。子流程是主流程中的一部分流程片段,并非独立
的流程定义,一般作为局部通用逻辑处理,或者因为特定业务需要,使比较复杂的单个主流程设计
清晰直观。
图形标记
子流程显示为标准的节点,它是一个圆角矩形。子流程有两种形态:如果子流程是折叠的,就
只显示名称和一个加号标记,从而高度概括了流程,如图所示;如果子流程是展开的,子流
程的步骤显示在子流程边界内,如图所示:
- 子流程展开展示
- 子流程折叠展示
XML内容
子流程由 subProcess 元素定义,作为子流程一部分的所有活动,网关,事件和儿子都需要包含
在这个元素中
<process id="mainProcess" name="主流程" isExecutable="true">
<startEvent id="startEvent1"></startEvent>
<subProcess id="subProcess">
<startEvent id="subProcessStart" />
<endEvent id="subProcessEnd" />
</subProcess>
</process>
可以看出,<subProcess>
元素与主流程的其它元素同级,可以视作为主流程的专属属性,其本
质上只有一个流程,因此共享数据,使用主流程的 key 也能查询出子流程的任务等信息,主子流程的变量信息也是共享的。
使用示例
子流程就是将其中一部分可复用的片段组合到一个区域块中进行复用,将整个子流程都会被完
整地定义在父流程中,支持子流程的展开与缩放,使流程图设计更加简洁明了。如果不使用子流程,
同样也会将这些流程活动定义到主流程中,与子流程的效果一样,但是如果想为某部分流程活动添
加特定的事件范围,那么此时使用嵌入式子流程就很有必要。子流程主要的应用场景主要有以下两种:
1、子流程可以用于分层建模。在常见的建模工具中,都允许将子流程进行折叠来隐藏子流程的
所有细节,从而展示业务流程的高层端到端总览。
2、子流程会为事件创建新的作用域。在子流程执行中抛出的事件可以通过子流程边界上的边界
事件捕获,事件所创建的作用域只局限在子流程内。
在使用子流程时要考虑以下几个限制:
2.1、子流程有且只能有一个空开始事件,而不允许有其它类型的开始事件。
2.2、子流程至少有一个结束事件。需要注意的是,在 BPMN 2.0 规范中允许省略子流程的启动与
结束事件,但是当前 Flowable 的实现并不支持。
2.3、顺序流不能跨越子流程边界。子流程中顺序流不能直接输出流到子流程之外的活动上,有需
要可以通过边界事件替代。
下面我们用一个示例流程来演示子流程的用法。如图所示是一个贷款申请的流程,要经
过贷款申请、贷款额度审批和发放贷款三个环节,其中贷款申请环节和发放贷款环节使用的是用户
任务节点,而贷款额度审批环节使用的是子流程节点,内嵌了一个子流程。同时,子流程边界上加
入定时边界事件,如果定时器触发前子流程结束,则主流程流转到发放贷款节点;如果定时器触发
时子流程还没有结束,则直接流转到结束节点,整个流程结束。
内嵌子流程示例流程
<process id="nestSubProcessTest" name="子流程-嵌套子流程" isExecutable="true">
<startEvent id="a78cb04a6b33d4993b841324220a7535a" />
<userTask id="a0211d54ab2a949939ce31ff31c053b37" name="贷款申请">
<extensionElements>
<flowable:formData />
<flowable:assigneeType>static</flowable:assigneeType>
</extensionElements>
</userTask>
<sequenceFlow id="abe410f43f9f8479baddf7da69016f637" sourceRef="a78cb04a6b33d4993b841324220a7535a" targetRef="a0211d54ab2a949939ce31ff31c053b37" />
<sequenceFlow id="Flow_0v94zzq" sourceRef="a0211d54ab2a949939ce31ff31c053b37" targetRef="Activity_1ndamrq" />
<subProcess id="Activity_1ndamrq" name="贷款额度审批">
<startEvent id="Event_1xr63oz">
<extensionElements>
<flowable:formData />
</extensionElements>
</startEvent>
<sequenceFlow id="Flow_1onxxsx" sourceRef="Event_1xr63oz" targetRef="Activity_0zp1e7g" />
<userTask id="Activity_10gcslh" name="复核贷款额度">
<extensionElements>
<flowable:formData />
<flowable:assigneeType>static</flowable:assigneeType>
</extensionElements>
</userTask>
<endEvent id="Event_0ulgoqy" />
<sequenceFlow id="Flow_0pcmaok" sourceRef="Activity_10gcslh" targetRef="Event_0ulgoqy" />
<userTask id="Activity_0zp1e7g" name="审批贷款额度">
<extensionElements>
<flowable:assigneeType>static</flowable:assigneeType>
<flowable:formData />
</extensionElements>
</userTask>
<exclusiveGateway id="Gateway_1h3mxrw" default="Flow_0jcc7nk" />
<sequenceFlow id="Flow_1j4me9j" sourceRef="Activity_0zp1e7g" targetRef="Gateway_1h3mxrw" />
<sequenceFlow id="Flow_0jcc7nk" name="小于100w" sourceRef="Gateway_1h3mxrw" targetRef="Event_0ulgoqy" />
<sequenceFlow id="Flow_06jy5zt" name="大于等于100w" sourceRef="Gateway_1h3mxrw" targetRef="Activity_10gcslh">
<conditionExpression xsi:type="tFormalExpression">${money>=100}</conditionExpression>
</sequenceFlow>
</subProcess>
<endEvent id="Event_1e8x10z" />
<userTask id="Activity_0id07bt" name="发放贷款">
<extensionElements>
<flowable:formData />
<flowable:assigneeType>static</flowable:assigneeType>
</extensionElements>
</userTask>
<sequenceFlow id="Flow_1h37g0l" sourceRef="Activity_1ndamrq" targetRef="Activity_0id07bt" />
<sequenceFlow id="Flow_1b7pjk9" sourceRef="Activity_0id07bt" targetRef="Event_1e8x10z" />
<boundaryEvent id="Event_1902kar" name="30分钟" attachedToRef="Activity_1ndamrq">
<timerEventDefinition>
<timeDuration>PT2M</timeDuration>
</timerEventDefinition>
</boundaryEvent>
<sequenceFlow id="Flow_1ap39px" sourceRef="Event_1902kar" targetRef="Event_1e8x10z" />
</process>
视频讲解
嵌套子流程