天天看點

Flowable 中 ReceiveTask 怎麼玩?

在之前的案例中,松哥和大家舉例最多的 Task 主要是 UserTask 和 ServiceTask,ReceiveTask 雖然也和大家提過但是沒有仔細講過,今天我們就來捋一捋 ReceiveTask 在 Flowable 中到底怎麼玩。

1. 使用場景

接受任務(Receive Task),接觸過 Flowable 的小夥伴應該是見過或者聽說過,它的圖示如下圖:

Flowable 中 ReceiveTask 怎麼玩?

ReceiveTask 可以算是 Flowable 中最簡單的一種任務,當該任務到達的時候,它不做任何邏輯,而是被動地等待使用者 Trigger。

ReceiveTask 往往适用于一些不明确的阻塞,例如:一個複雜的計算需要等待很多條件,這些條件是需要人為來判斷是否可以執行,而不是直接執行,這個時候,從業人員如果判斷可以繼續了,那麼就 Trigger 一下使流程繼續向下執行。

基于以上介紹,ReceiveTask 還有一個中文名字叫做等待任務,也就是說,流程走到 ReceiveTask 這個節點的時候,就卡住了,需要使用者手動點一下,流程才會繼續向下走。

2. 實踐

2.1 繪制流程圖

我們繪制一個簡單的流程圖來看下 ReceiveTask 到底是啥樣子,流程圖如下:

Flowable 中 ReceiveTask 怎麼玩?

ReceiveTask 圖示上有一個信封。

小夥伴們繪制的時候,首先選擇使用者任務:

Flowable 中 ReceiveTask 怎麼玩?

然後點選設定按鈕,将使用者任務切換為 ReceiveTask 即可:

Flowable 中 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="統計今日銷售額"></receiveTask>
  <receiveTask id="sendMsg" name="發送今日銷售業績給老闆"></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​

​​ 表進行檢視,發現該表空空如也。也就是 ReceiveTask 并不會被記錄在 ​

​ACT_RU_TASK​

​​ 表中,他們隻是單純的被記錄在 ​

​ACT_RU_EXECUTION​

​ 表中,因為在該表中,我們可以檢視 ReceiveTask 的記錄。

對于 ReceiveTask 的觸發方式也很簡單,如下:

@Test
void test10() {
    List<Execution> list = runtimeService.createExecutionQuery().activityId("todaySales").list();
    for (Execution execution : list) {
        runtimeService.trigger(execution.getId());
    }
}      

由于 ReceiveTask 的觸發需要傳入的參數是執行執行個體 ID 而不是流程執行個體 ID,是以我們要查詢出來目前待觸發的執行執行個體 ID。具體的查詢方式就是根據 ReceiveTask 的節點名稱去查詢。

查詢到執行執行個體 ID 之後,調用 trigger 方法完成觸發,使得流程繼續向下走。

好啦,現在流程進入到​

​發送今日銷售業績給老闆​

​這個環節了,老辦法繼續查詢并執行:

@Test
void test10() {
    List<Execution> list = runtimeService.createExecutionQuery().activityId("sendMsg").list();
    for (Execution execution : list) {
        runtimeService.trigger(execution.getId());
    }
}