Activiti 5.3提供了子流程的實現,包括兩種基於子流程的實現:
一種是內嵌子流程:子流程元素<subProcess>內嵌在主流程元素<process>之內,只能在該流程中使用該子流程,外部是無法訪問到的。這種子流程一般作爲局部通用邏輯處理,或者因爲特定業務需要,使得比較複雜的單個主流程設計清晰直觀;
另一種是調用子流程:首先實現一個流程,在另一個流程中可以調用該流程,通常可以定義一些通用的流程作爲這種調用子流程,供其他多個流程定義複用。這種子流程使用<callActivity>元素來進行調用,間接地嵌入到主流程中,用起來比較方便。
內嵌子流程
實現的基於內嵌子流程的流程,示例如圖所示:
對應的流程定義文件SubProcessTest.MySubprocess.bpmn20.xml,內容如下所示:
流程定義中,實現了3個TaskListener,對應的代碼分別如下所示:
測試用例,代碼如下所示:
運行結果信息,如下所示:
調用子流程
實現的子流程,示例如圖所示:
對應的流程定義文件Subprocess.Check.bpmn20.xml,如下所示:
上面的流程定義,和通常定義流程的方式是相同的。流程中,對應的JavaDelegate的實現類,代碼如下所示:
該BusinessCheck類簡單用來校驗用戶數據。
下面看一下主流程,如圖所示:
上面的callSubprocess結點對應的就是流程定義中的<callActivity>元素,調用了外部流程。對應的流程定義文件Subprocess.Mainprocess.bpmn20.xml,如下所示:
需要說明的是,對於主流程與子流程之間進行數據交換,需要在<callActivity>元素中進行配置,通過執行“傳入”、“傳出”變量的方式來進行。片段如下所示:
我們可以通過在主流程中設置一個變量爲varOutFromMainprocess,並指定對應的輸入數據,根據流程定義,會將變量varOutFromMainprocess對應的值,傳遞給子流程中的變量varInSubprocess,只需要在子流程中獲取變量varInSubprocess的值即可。從子流程中傳出數據的道理是類似的。上面實現了2個JavaDelegate處理類,代碼分別如下所示:
實現的測試用例,代碼如下所示:
代碼中org.shirdrn.workflow.activiti.AbstractTest類可以參考:Activiti 5.3:流程活動自動與手工觸發執行裏面。上述測試程序運行結果如下所示: