顧名思義,子流程是一個包含其他活動、網關、事件等的活動,這些活動本身形成了一個流程,該流程是更大流程的一部分。 使用子流程確實有一些限制: 一個子流程只能有一個none類型的啟動事件,不允許有其他類型的啟動事件。一個子流程必須至少有一個結束事件。(請註意,BPMN 2.0 規範允許在子流程中省略開始 ...
顧名思義,子流程是一個包含其他活動、網關、事件等的活動,這些活動本身形成了一個流程,該流程是更大流程的一部分。
使用子流程確實有一些限制:
- 一個子流程只能有一個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表新增了一條王五的任務
王五完成任務後,整個流程就結束了