1. 程式人生 > >jBPM-4.4:主流程(process)與子流程(sub-process)之間交換資料

jBPM-4.4:主流程(process)與子流程(sub-process)之間交換資料

現在假設存在這樣一個流程:

首先需要進行復雜的鑑權,而且可能隨著需求的變化而變化,這導致鑑權的流程也是時刻可能變化的。而只有當鑑權成功以後,才能執行實際的交易操作,例如向外部系統傳送請求報文獲取某些交易的資料。

這時,可以考慮將鑑權流程獨立做成一個子流程,然後將其嵌入到主流程中去,適應區域性流程變化而無需修改全域性流程的問題,在子流程與主流程之間實際要做的就是約定資料的交換協議,即確定資料在子流程與主流程之間的流入與流出。

下面通過一個實際例子來說明並實踐。

首先,定義主流程。

主流程包含鑑權的子流程,鑑權通過之後,收集鑑權過程中獲取到的交易必需的資料,組裝請求報文,流程定義如圖所示:

對應的流程定義檔案main-process.jpdl.xml,如下所示:

 

上面,sub-process-key="SubCheckProcess"表示一個嵌入主流程中的鑑權子流程。通過流程定義檔案內容,可以看到,在主流程與子流程之間交換資料,是通過變數myRequest來實現的:

<parameter-in>元素表示從主流程MainProcess中流入到子流程SubCheckProcess中變數為myRequest,而var="myRequest"表示在主流程中變數名稱,而subvar="myRequest"表示在子流程中可以通過獲取到myRequest變數從而得到資料。同理,<parameter-out>元素表示從子流程SubCheckProcess中流出到MainProcess中,將資料又傳回主流程中,繼續後續流程的操作。

另外,主流程在執行完子流程後,又執行了ExternalRequest結點,對應的處理類為com.umpay.workflow.jbpm.handler.ExternalRequestHandler,如下所示:

然後,實現子流程。

子流程定義,如圖所示:

對應的流程定義檔案sub-check-process.jpdl.xml,內容如下所示:

上面對應了6個處理類,實現分別如下所示:

在執行子流程的過程中,在每一個節點處處理,都模擬了“獲取到一些額外的必需資料”。

最後,測試用例。

測試用例,如下所示:

上述程式,開始要需要部署流程,主流程和子流程需要單獨部署,實際是在這個具體的例子中,存在兩個流程,它們在執行自己的例項的時候是獨立的。在流程啟動之前,需要根據流程執行需要,輸入在流程中能夠獲取到的資料(Key+Value的形式)。接著就可以運行了,可以看到,最終可以看到流程資料的集合 :

Main process variables: {goodsId=030, mobileId=13800138000, userId=20110001674, merId=001, goodsCount=2000, mbr=mbr_001_CMPAY010, gbr=gbr_030_CMPAY010, bankId=CMPAY010}

這裡,資料集合{userId=20110001674, goodsCount=2000, mbr=mbr_001_CMPAY010, gbr=gbr_030_CMPAY010}都是在執行處理的時候獲取到的交易操作所需要的資料。