Flowable 中 ReceiveTask 怎么玩?
在之前的案例中,松哥和大家舉例最多的 Task 主要是 UserTask 和 ServiceTask,ReceiveTask 雖然也和大家提過但是沒有仔細講過,今天我們就來捋一捋 ReceiveTask 在 Flowable 中到底怎么玩。
1. 使用場景
接受任務(Receive Task),接觸過 Flowable 的小伙伴應該是見過或者聽說過,它的圖標如下圖:
ReceiveTask 可以算是 Flowable 中最簡單的一種任務,當該任務到達的時候,它不做任何邏輯,而是被動地等待用戶 Trigger。
ReceiveTask 往往適用于一些不明確的阻塞,例如:一個復雜的計算需要等待很多條件,這些條件是需要人為來判斷是否可以執(zhí)行,而不是直接執(zhí)行,這個時候,工作人員如果判斷可以繼續(xù)了,那么就 Trigger 一下使流程繼續(xù)向下執(zhí)行。
基于以上介紹,ReceiveTask 還有一個中文名字叫做等待任務,也就是說,流程走到 ReceiveTask 這個節(jié)點的時候,就卡住了,需要用戶手動點一下,流程才會繼續(xù)向下走。
2. 實踐
2.1 繪制流程圖
我們繪制一個簡單的流程圖來看下 ReceiveTask 到底是啥樣子,流程圖如下:
ReceiveTask 圖標上有一個信封。
小伙伴們繪制的時候,首先選擇用戶任務:
然后點擊設置按鈕,將用戶任務切換為 ReceiveTask 即可:
繪制完成后,我們下載這個流程圖對應的 XML 文件。
來看看,帶 ReceiveTask 的流程圖是下面這樣的:
<process id="receiveTask_demo" name="接收任務測試流程" isExecutable="true">
<documentation>接收任務測試流程</documentation>
<startEvent id="startEvent" flowable:formFieldValidation="true"></startEvent>
<sequenceFlow id="sid-9E7B327E-EFC8-4D29-8C6F-157D5E1B7A4E" sourceRef="startEvent" targetRef="todaySales"></sequenceFlow>
<receiveTask id="todaySales" name="統(tǒng)計今日銷售額"></receiveTask>
<receiveTask id="sendMsg" name="發(fā)送今日銷售業(yè)績給老板"></receiveTask>
<endEvent id="endEvent"></endEvent>
<sequenceFlow id="s2" sourceRef="todaySales" targetRef="sendMsg"></sequenceFlow>
<sequenceFlow id="s3" sourceRef="sendMsg" targetRef="endEvent"></sequenceFlow>
</process>
2.2 部署
這個松哥在之前的文章中已經反復介紹過多次了,這里就不再贅述了,大家參考我們之前的文章部署并啟動上面這個流程。
2.3 分析
當流程啟動之后,按照我們前面文章的分析,我們先去數據庫中 ACT_RU_TASK? 表進行查看,發(fā)現該表空空如也。也就是 ReceiveTask 并不會被記錄在 ACT_RU_TASK? 表中,他們只是單純的被記錄在 ACT_RU_EXECUTION 表中,因為在該表中,我們可以查看 ReceiveTask 的記錄。
對于 ReceiveTask 的觸發(fā)方式也很簡單,如下:
@Test
void test10() {
List<Execution> list = runtimeService.createExecutionQuery().activityId("todaySales").list();
for (Execution execution : list) {
runtimeService.trigger(execution.getId());
}
}
由于 ReceiveTask 的觸發(fā)需要傳入的參數是執(zhí)行實例 ID 而不是流程實例 ID,所以我們要查詢出來當前待觸發(fā)的執(zhí)行實例 ID。具體的查詢方式就是根據 ReceiveTask 的節(jié)點名稱去查詢。
查詢到執(zhí)行實例 ID 之后,調用 trigger 方法完成觸發(fā),使得流程繼續(xù)向下走。
好啦,現在流程進入到發(fā)送今日銷售業(yè)績給老板這個環(huán)節(jié)了,老辦法繼續(xù)查詢并執(zhí)行:
@Test
void test10() {
List<Execution> list = runtimeService.createExecutionQuery().activityId("sendMsg").list();
for (Execution execution : list) {
runtimeService.trigger(execution.getId());
}
}
這個執(zhí)行完層后,這個流程就結束了。現在我們去查看 ACT_RU_ACTINST? 表已經空了,查看 ACT_RU_EXECUTION 表也空了。