子流程時包含其他的活動、網關、事件等的活動。其本身構成一個流程,並作爲更大流程的一部分。子流程完全在父流程中定義(這就時爲什麼經常被稱作嵌入式子流程)。
子流程有兩個主要的使用場景:
- 子流程可以分層建模。很多建模工具都可以摺疊子流程,隱藏子流程的所有細節,而只顯示業務流程的高層端到端總覽。
- 子流程創建了新的事件範圍。在子流程執行中拋出的事件,可以通過子流程邊界上的邊界事件捕獲。因此爲該事件創建了限制在子流程內的範圍。
使用子流程也要注意以下幾點:
- 子流程只能有一個空啓動事件,而不允許有其他類型的啓動事件。請注意BPMN2.0規範允許省略子流程的啓動與結束事件,然而當前的Activiti實現並不支持省略。
- 順序流不能跨子流程邊界。
子流程標識爲標準活動,即圓角矩形。若摺疊了子流程,則只顯示其名字與一個加號,提供了流程的高層概覽:
若展開了子流程,則子流程的所有步驟都在流程邊界內顯示:
使用子流程的一個主要原因,是爲特定事件定義範圍,下面我們使用一個demo驗證下:
1、創建子流程
其對應的xml如下:
<process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
<startEvent id="start" name="開始"/>
<userTask activiti:exclusive="true" id="commit" name="提交"/>
<subProcess activiti:exclusive="true" id="_4" name="SubProcess" triggeredByEvent="false">
<startEvent id="subStart" name="子開始"/>
<userTask activiti:exclusive="true" id="subCommit" name="子提交"/>
<endEvent id="subEnd" name="子結束"/>
<sequenceFlow id="_15" sourceRef="subStart" targetRef="subCommit"/>
<userTask activiti:exclusive="true" id="subCheck" name="子審覈"/>
<sequenceFlow id="_18" sourceRef="subCommit" targetRef="subCheck"/>
<sequenceFlow id="_19" sourceRef="subCheck" targetRef="subEnd"/>
</subProcess>
<userTask activiti:exclusive="true" id="check" name="審覈"/>
<endEvent id="end" name="結束"/>
<sequenceFlow id="_11" sourceRef="start" targetRef="commit"/>
<sequenceFlow id="_12" sourceRef="commit" targetRef="_4"/>
<sequenceFlow id="_13" sourceRef="_4" targetRef="check"/>
<sequenceFlow id="_14" sourceRef="check" targetRef="end"/>
</process>
2、啓動流程,查看當前任務表act_run_task,當前任務爲“提交”:
3、查看流程實例表、流程運行表:
4、完成當前任務,流程繼續往下走,再次查看當前任務表,可以看到子流程自動啓動
5、查看流程實例表、流程運行表,生成了兩個執行流:主流程、子流程。
PS: 流程邊界事件這塊,因爲idea提供的bpmn插件,沒有找到邊界事件的控件,我沒有試,有了解的朋友可以告訴我下,後期我再嘗試。