activiti 7 + springboot2(十三)網關


activiti中有四種網關:並行網關,排他網關,包含網關,基於事件網關

  • 排它網關: 內部是一個“X”圖標,用來在流程中實現決策。 當流程執行到這個網關,所有外出順序流都會被處理一遍。 其中條件解析為true的順序流會被選中,讓流程繼續運行。
  • 並行網關: 內部是一個“加號”圖標。它允許將流程 分成多條分支,也可以把多條分支 匯聚到一起。
  • 包含網關: 內部包含一個圓圈圖標,可以看做是排他網關和並行網關的結合體。 和排他網關一樣,你可以在外出順序流上定義條件,包含網關會解析它們。 但是主要的區別是包含網關可以選擇多於一條順序流,這和並行網關一樣。
  • 基於事件網關: 網關的每個外出順序流都要連接到一個中間捕獲事件。 當流程到達一個基於事件網關,網關會進入等待狀態:會暫停執行。 與此同時,會為每個外出順序流創建相對的事件訂閱。

主要使用的是並行網關和排他網關。

(一)排他網關(也叫異或(XOR)網關,或叫基於數據的排他網關),用來在流程中實現決策。當流程執行到這個網關,所有分支都會判斷條件是否為true,如果為true則執行該分支,注意,排他網關只會選擇一個為true的分支執行。(即使有兩個分支條件都為true,排他網關也會只選擇一條分支去執行), 如果從網關出去的線所有條件都不滿足則系統拋出異常。

1)圖例:在部門經理審核后,走排他網關,從排他網關出來的分支有兩條,一條是判斷請假天數是否大於3天,另一條是判斷請假天數是否小於等於3天。

 

2)測試:啟動一個實例---->填寫請假單--->部門經理審批

    /**
     * 啟動一個實例
     */
    @Test
    public void startProcessInstance() {
        //啟動流程實例,同時還要設置流程定義的變量值
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1");
        System.out.println("流程實例id:" + processInstance.getProcessInstanceId());
    }

    /**
     * 填請假單任務執行
     */
    @Test
    public void step1(){

        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myProcess_1")
                .taskAssignee("張三")
                .singleResult();

        if(task!=null){

            Holiday holiday = new Holiday();
            holiday.setDays(5F); //請假5天
            Map<String,Object> map = new HashMap<>();
            map.put("holiday",holiday);//流程變量賦值

            taskService.complete(task.getId(),map);
            System.out.println("用戶任務執行完畢...");
        }
    }

    /**
     * 部門經理完成審批
     */
    @Test
    public void step2() {
        Task task = taskService.createTaskQuery().processDefinitionKey("myProcess_1")
                .taskAssignee("李四").singleResult();

        if (task != null) {
            taskService.complete(task.getId());//完成任務時,設置流程變量的值
            System.out.println("用戶任務執行完畢...");
        }
    }

查看數據庫,可以看到張三請假5天,部門經理審批后經過網關流轉到總經理審批。

 

后續執行總經理審批和人事審批,最后數據庫如下:

 

(二)並行網關

並行網關允許將流程分成多條分支,也可以把多條分支匯聚到一起,並行網關的功能是基於進入和外出順序流的:

  • fork分支:並行后的所有外出順序流,為每個順序流都創建一個並發分支。
  • join匯聚:所有到達並行網關,在此等待的進入分支,直到所有進入順序流的分支都到達以后,流程就會通過匯聚網關。

如果同一個並行網關有多個進入和多個外出順序流,它就同時具有分支和匯聚功能。這時,網關會先匯聚所有進入的順序流,然后再切分成多個並行分支。與其他網關的主要區別是,並行網關不會解析條件。即使順序流中定義了條件,也會被忽略。

 

人事執行審批,流轉到網關,啟動2條並行任務

    /**
     * 人事審批
     */
    @Test
    public void step4() {
        Task task = taskService.createTaskQuery().processDefinitionKey("myProcess_2")
                .taskAssignee("趙六").singleResult();

        if (task != null) {
            taskService.complete(task.getId());//完成任務時,設置流程變量的值
            System.out.println("用戶任務執行完畢...");
        }
    }

見數據庫記錄,歷史節點表

 

 

運行時任務節點表

 

 

 運行時流程執行實例表

 

 財務結算和行政考勤是兩個execution分支,在ACT_RU_EXECUTION表有兩條記錄分別是財務結算和行政考勤,ACT_RU_EXECUTION還有一條記錄表示該流程實例。待行政考勤和財務結算任務全部完成,在匯聚點匯聚,通過parallelGateway並行網關。並行網關在業務應用中常用於會簽任務,會簽任務即多個參與者共同辦理的任務。

后續繼續執行行政考勤和財務會計流程

    /**
     * 行政考勤
     */
    @Test
    public void step5() {
        Task task = taskService.createTaskQuery().processDefinitionKey("myProcess_2")
                .taskAssignee("王五").singleResult();

        if (task != null) {
            taskService.complete(task.getId());//完成任務時,設置流程變量的值
            System.out.println("用戶任務執行完畢...");
        }
    }

    /**
     * 財務會計
     */
    @Test
    public void step6() {
        Task task = taskService.createTaskQuery().processDefinitionKey("myProcess_2")
                .taskAssignee("孫八").singleResult();

        if (task != null) {
            taskService.complete(task.getId());//完成任務時,設置流程變量的值
            System.out.println("用戶任務執行完畢...");
        }
    }

 

 

 有並行網關的匯聚結點:說明有一個分支已經到匯聚,等待其它的分支到達。
當所有分支任務都完成,都到達匯聚結點后,所有分支到達匯聚結點,並行網關執行完成。
此時查看ACT_RU_EXECUTION表和ACT_RU_TASK表中的可執行實例和可執行任務都不復存在,表明該流程已經結束。

源代碼下載  https://download.csdn.net/download/zsg88/12113397


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM