Activiti6.0教程(7) - 並行閘道器(ParallelGateway)用法
先看官網描述
Gateways can also be used to model concurrency in a process. The most straightforward gateway to introduce concurrency in a process model, is the Parallel Gateway, which allows to fork into multiple paths of execution or join multiple incoming paths of execution.
翻譯過來
閘道器還可以用於對流程中的併發性建模。在流程模型中引入併發性的最簡單的閘道器是並行閘道器,它允許分叉到多個執行路徑或連線多個傳入的執行路徑。
說白了就是流程有分支了, 就叫並行, 其實我覺得這個應該叫分支閘道器比較好, 不容易誤導人, 舉個例子
下面這個是官網上的圖
大致意思就是: 啟動訂單流程 -> 分成兩個分支(發貨, 收款) -> 兩個分支任務都完成了 -> 合併分支 -> 訂單歸檔 -> 流程結束
下面來看一個例子
流程圖
說明
受理人分別是
- 付款(買家) user
- 發貨(賣家) seller
- 收貨(買家) user
- 收款(賣家) seller
測試
啟動流程
@Test public void startProcess() { ProcessInstance instance = runtimeService.startProcessInstanceByKey("TestParallelGateway"); System.out.println(instance.getId()); }
流程啟動後, 資料庫裡執行例項有三條
可以看到流程例項ID都是一樣的, 說明它們是一個流程的任務例項, 只不過下面兩條例項有一個 PARENT_ID 就是第一個例項的id, 可以這樣理解, 第一條例項就是閘道器的例項, 下面兩條是兩條分支的例項
查詢任務
現在有兩條線, 可以分別查詢受理人為 user
和 seller
的任務, 它們各有一條任務
@Test public void queryTask() { List<Task> tasks = taskService.createTaskQuery().taskAssignee("seller") // 分頁查詢 // .listPage(firstResult, maxResults) // 排序 // .orderByTaskCreateTime().desc() .list(); for (Task task : tasks) { System.out.println("任務ID: " + task.getId()); System.out.println("受理人: " + task.getAssignee()); System.out.println("任務名: " + task.getName()); System.out.println("-------------------------------"); } }
接原鏈文: https://tomoya92.github.io/2019/04/25/activiti-parallel-gateway/
輸出賣家的任務
任務ID: 26 受理人: seller 任務名: 發貨(賣家) -------------------------------
查詢出任務id後就可以來處理任務了
處理任務
@Test public void completeTask() { String taskId = "26"; taskService.complete(taskId); }
賣家處理id為26的任務後, 流程就走到下一條了, 也就是說現在買家有兩條任務了, 再用買家的受理人名查一次任務,結果如下
任務ID: 23 受理人: user 任務名: 付款(買家) ------------------------------- 任務ID: 2502 受理人: user 任務名: 收貨(買家) -------------------------------
這時買家有兩條任務, 這時候買家可以先付款,也可以先收貨, 這都無所謂
- 如果買家先付款, 根據流程圖走向下一步賣家就有一條任務, 就是收款
- 如果買家先收貨, 那麼賣家現在是沒有任務的, 但買家就剩一個任務了(付款)
只有兩條分支的任務都處理完了, 流程才會走到下一個並行閘道器結束流程
總結
用了這麼個玩意, 受理人處理任務就可以有選擇的去處理了, 比如傳統的流程一般都是 付款(買) -> 收款(賣) -> 發貨(賣) -> 收貨(買)
加上並行閘道器後, 買家付款後, 賣家可以選擇 收款
或者 發貨
這對整個流程沒有影響, 不管它選擇先處理哪個任務, 流程還是沒有結束
說不出來有什麼好處, 也說不出來有啥不好的, 先記錄一下, 以後業務用上了心裡有個譜
寫部落格不易,轉載請保留原文連結,謝謝!
原文連結: