BPMN2.0區分一般的子流程,通常也稱作嵌入式子流程,與調用活動,儘管他們看起來很像。從概念上說,兩者都在流程執行到達該活動時,調用一個子流程。區別在於:調用活動引用一個流程定義外部的流程,而subprocess嵌入在原有流程定義內。調用活動的主要使用場景,是它有一個可重複使用的流程定義,可以在多個其他流程定義中調用。
當流程執行到大call activity時,會創建一個新的執行,作爲達到調用活動的執行的子執行。這個子執行之後用於執行子流程,潛在地創建了類似普通流程的並行子執行。父執行將等待子流程完成,之後沿原流程繼續執行。
調用活動是一個普通活動,需要有通過key引用流程定義的calledElement。在實際使用中,這通常意味着在calledElement中使用流程的id。
下面我們通過一個demo來驗證調用子流程的執行過程:
1、首先創建兩個流程:主流程master、子流程sub,主流程調用子流程(調用節點called Element填寫子流程的id)
<process id="myProcess" isClosed="false" isExecutable="true" processType="None">
<startEvent id="start" name="開始"/>
<userTask activiti:exclusive="true" id="commit" name="提交"/>
<callActivity activiti:exclusive="true" calledElement="subProcess" id="callsub" name="調用子流程"/>
<userTask activiti:exclusive="true" id="check" name="審覈"/>
<endEvent id="end" name="結束"/>
<sequenceFlow id="_7" sourceRef="commit" targetRef="callsub"/>
<sequenceFlow id="_8" sourceRef="callsub" targetRef="check"/>
<sequenceFlow id="_9" sourceRef="check" targetRef="end"/>
<sequenceFlow id="_10" sourceRef="start" targetRef="commit"/>
</process>
2、部署主流程、子流程後,啓動主流程查看流程實例表、流程執行表、當前任務表
3、提交當前任務,再次查看這3張表
可以看到,主流程走到調用節點,自動啓動子流程,爲其創建一個執行流。
4、子流程結束後,再次查看這3張表
可以看到子流程實例結束,回到主流程繼續執行。
調用子流程傳遞參數
由於調用式的子流程是獨立定義在一個流程文件中的,因此當執行流到達調用式子流程時,會創建新的流程實例。RuntimeService的setVariable等方法設置流程參數,這些流程參數的作用域只限於所設置的執行流,對於調用式子流程這種會產生新的流程實例的“特殊情況”,就需要使用另外的方式解決。Activiti提供了擴展配置,允許流程參數在主流程和子流程中傳遞。這塊我暫時還沒有嘗試,後期嘗試驗證下再補充上。