Activiti7 多實例子流程

顧名思義,子流程是一個包含其他活動、網關、事件等的活動,這些活動本身形成了一個流程,該流程是更大流程的一部分。

使用子流程確實有一些限制:

  • 一個子流程只能有一個none類型的啓動事件,不允許有其他類型的啓動事件。一個子流程必須至少有一個結束事件。(請注意,BPMN 2.0 規範允許在子流程中省略開始和結束事件,但當前的 Activiti 實現不支持這一點。)
  • 順序流(順序流是流程的兩個元素之間的連接器,說白了就是流程圖中的連線)不能跨越子流程邊界。

考慮下面這個流程圖

用多實例子流程實現了類似會籤的功能。(當然了,不用子流程,用多實例任務也能實現會籤功能。)

上面這個流程會根據傳入的人數來決定開啓幾個子流程,在每個子流程中第一個任務審批時指定下一個審批人(PS:流程變量)

代碼使用的是7.1.0.M6這個版本

 

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
    <version>7.1.0.M6</version>
</dependency>

測試代碼如下

package com.example.demo222;

import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

@SpringBootTest
class Demo222ApplicationTests {

    @Autowired
    private RepositoryService repositoryService;
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;

    @Test
    void testDeply() {
        repositoryService.createDeployment()
                .addClasspathResource("processes/test.bpmn20.xml")
                .name("test")
                .key("test")
                .deploy();
    }

    @Test
    void testStart() {
        Map<String, Object> variables = new HashMap<>();
        variables.put("assigneeList", Arrays.asList("zhangsanfeng", "lixiaoyao", "zhaolinger"));
        ProcessInstance processInstance = runtimeService.startProcessInstanceById("test:8:c76442ee-398a-11ed-b16c-84a9386654d8", variables);

        System.out.println(processInstance);
    }

    @Test
    void testCompleteTask2() {
        Map<String, Object> variables = new HashMap<>();
        variables.put("manager", "guanyu");
        taskService.complete("da51fa72-22d4-11ed-834c-84a9386654d8", variables);
    }

}

可以看到,流程啓動的時候,act_ru_execution表中插入了8條記錄,因爲有1個主流程,3個子流程,所以 (3+1)×2=8

每個子流程當前一個任務,總共3個激活的任務

每個流程有6個變量,3×6=18

當至少有2個子流程結束後,纔會回到主流程節點

 

下面再看另一個流程

這個流程跟前面一個實現的功能有一點點類似,只有一個子流程,子流程中有兩個並行的任務,當這兩個任務都完成後子流程就結束了

啓動流程以後,act_ru_execution表中應該新增4條記錄,因爲有主子2個流程

2個並行的任務

當張三完成任務以後,這個流程實例當前只剩下一個激活的任務

當李四也完成任務後,子流程結束,迴歸主流程。於是act_ru_execution表應該只剩2條記錄,act_ru_task表新增了一條王五的任務

王五完成任務後,整個流程就結束了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章