1.實現并行流子流程
1.畫圖


?2.創建實體
package com.jmj.camunda7test.subProcess.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Cooker implements Serializable {public static final List<Cooker> repositoryCooker = new ArrayList();static {repositoryCooker.add(new Cooker("1","張三"));repositoryCooker.add(new Cooker("2","李四"));}private String cookerId;private String cookerName;}
package com.jmj.camunda7test.subProcess.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dish implements Serializable {public static final List<Dish> repositoryDish = new ArrayList();public static final Map<String,List<Dish>> relationDish = new HashMap<>();static {Dish dish1 = new Dish("1", "番茄炒蛋");Dish dish2 = new Dish("2", "青椒炒肉");Dish dish3 = new Dish("3", "螞蟻上樹");Dish dish4 = new Dish("4", "蛋炒飯");Dish dish5 = new Dish("5", "鍋包肉");repositoryDish.add(dish1);repositoryDish.add(dish2);repositoryDish.add(dish3);repositoryDish.add(dish4);repositoryDish.add(dish5);relationDish.put("1",new ArrayList<>(){{add(dish1);add(dish2);add(dish3);}});relationDish.put("2",new ArrayList<>(){{add(dish4);add(dish5);}});}private String dishId;private String dishName;
}
3.注入對象
@Autowiredprivate RepositoryService repositoryService;@Autowiredprivate RuntimeService runtimeService;@Autowiredprivate TaskService taskService;
4.部署流程
@Testvoid depoly() {repositoryService.createDeployment().name("做菜流程").addClasspathResource("bpmn/做菜流程.bpmn")//綁定需要部署的流程文件.enableDuplicateFiltering(true).deploy();}
5.啟動流程
private static final String cookerIdList = "cookerIdList";@Testvoid createProcess() {Map<String, Object> map = new HashMap<>();map.put(cookerIdList, Cooker.repositoryCooker);ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("chi-fan-process", "chi-fan", map);System.out.println("流程啟動成功: 流程實例ID=" + processInstance.getProcessInstanceId());String processInstanceId = processInstance.getProcessInstanceId();Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();System.out.println("生成的任務Id:" + task.getId() + "任務名:" + task.getName());taskService.claim(task.getId(), "jmj");System.out.println("將任務委托給jmj");}
6.一系列執行
private static final String jmj = "jmj";@Testvoid queryTaskInfo() {Task task = taskService.createTaskQuery().taskAssignee("jmj").list().get(0);System.out.println("任務是否處于懸停狀態:" + task.isSuspended());System.out.println("設置任務一些參數");String id = task.getId();String processInstanceId = task.getProcessInstanceId();//那兩個方法實際是一樣的
// runtimeService.setVariableLocal(processInstanceId,"local","jaa");taskService.setVariableLocal(id, "localTask", "bbb");}@Testvoid completeFirsCreate() {Task task = taskService.createTaskQuery().taskAssignee("jmj").list().get(0);taskService.complete(task.getId());}@Testvoid subExecutionQuery() {List<Execution> list = runtimeService.createExecutionQuery().processDefinitionKey("chi-fan-process").list();for (Execution execution : list) {System.out.println(execution.isEnded());System.out.println(execution.isSuspended());System.out.println(execution.getId());}}@Testvoid subTaskQuery() {Cooker cooker = Cooker.repositoryCooker.get(0);String cookerId = cooker.getCookerId();List<Task> list = taskService.createTaskQuery().taskAssignee(cookerId).processDefinitionKey("chi-fan-process").list();for (Task task : list) {String id = task.getId();String name = task.getName();String assignee = task.getAssignee();System.out.println(id + " " + name + " " + assignee);}List<Dish> dishes = Dish.relationDish.get(cookerId);System.out.println(dishes);Task task = list.get(0);String id = task.getId();// Map<String, Object> variables = taskService.getVariables(id);Map<String, Object> variables = runtimeService.getVariables(task.getExecutionId());System.out.println("所有的流程變量:" + variables.size());variables.forEach((k, v) -> {System.out.println(k + " = " + v);});//給的是實例就是全局 給的是執行器就是 局部runtimeService.setVariable("123", "subtaskxTask", "這應該是執行器的作用域3");//全局// Object subtaskxTask = runtimeService.getVariable(task.getProcessInstanceId(), "subtaskxTask");
// System.out.println(subtaskxTask);//3
// Object subtaskxTask1 = runtimeService.getVariable(task.getExecutionId(), "subtaskxTask");
// System.out.println(subtaskxTask1);//1
// taskService.setVariable(id,"subtask2Task2","測試子任務2的局部流程變量,這應該是實例作用域");//執行器}@Testvoid completeSubTask() {Map<String, Object> map = new HashMap<>();map.put("測試是什么位置的", 1);taskService.complete("95e204a4-3cd6-11ef-b405-005056c00008", map);//map是最外層的流程變量}@Testvoid q() {Task task = taskService.createTaskQuery().taskId("95e204a4-3cd6-11ef-b405-005056c00008").singleResult();//執行完一個任務就不存在了System.out.println(task);}//作用域 任務id>執行器>實例@Testvoid querySubExecutionId() {Cooker cooker = Cooker.repositoryCooker.get(0);String cookerId = cooker.getCookerId();List<Task> list = taskService.createTaskQuery().taskAssignee(cookerId).processDefinitionKey("chi-fan-process").list();Task task = list.get(0);Map<String, Object> variables = taskService.getVariables(task.getId());System.out.println(variables.size());variables.forEach((k, v) -> {System.out.println(k + " = " + v);});// taskService.setVariableLocal(task.getId(),"tset","測試局部任務作用域");//作用域ID為taskId //代表當前任務
// runtimeService.setVariableLocal(task.getExecutionId(),"tset","測試局部任務作用域12");//作用域ID為executeId 執行器代表當前流程//子流程的一級父類的變量需要等所有子流程結束后,才會消失 二級執行器就是一個流程執行完生命周期,就消失taskService.complete(task.getId());//只會去除任務ID作用域下的變量//執行器ID等于流程實例ID}//任務ID 可以拿到當前流程的執行器ID
2.如何廢棄一個流程
@Testvoid deleteAnProcess() {runtimeService.deleteProcessInstance("31a61f25-3cf1-11ef-b3cd-005056c00008","測試刪除");}
3.總結
- 關于作用域有三種,其一是 父流程實例作用域,其二子流程實例作用域,最后是任務作用域,三種作用域,從前往后,后面的作用域可以獲取前面的作用域的流程變量,而前面的不能獲取后面的流程變量
- 流程實例ID其實就等于執行器ID,在一個任務下,給執行器ID作作用域,其實就是給當前流程實例作全局變量。
- runtimeService與taskService里 getVariable 與 getVariableLocal 的區別,前者的參數是執行器ID,也就當前流程作用域下的變量,如果沒有子流程,則就是獲取全局的流程變量,如果有子流程,就是獲取子流程與父流程所擁有的流程變量,而?getVariableLocal 僅僅獲取此作用域下的變量,不會拿到父類作用域下的變量。同理 taskService? getVariable ?是拿當前任務作用域 以及當前子流程作用域 以及父流程作用域下的全局變量,?getVariableLocal只是獲取當前任務作用域下的變量。
- 作用域下如果有相同名字的變量,則會拿到離自己作用域最近的值。
- 子流程獲取不到另一個子流程的流程變量,若要互相傳遞參數,則可以放入父流程的全局變量
- claim方法其實和 setAssignee 差不多,區別就是, setAssignee可以用無限次,而claim設定以后,再次設定就會報錯,設置了Assignee就相當于設置了claim。
- 子流程他其實創建的時候,會先創建多實例子流程體,然后每個子流程實例會有一個框框執行器,框框執行器繼承多實例子流程體,框框執行器里面才是執行流程體,這個框框執行器就是給每個子流程放入子流程獨立的全局變量(傳入集合參數)用的。? 若兩個子流程,會創建一個實例執行器(沒有父ID,因為就是流程本身),兩個框框執行器(繼承多實例子流程體),兩個子流程執行器(分別繼承框框執行器)。