《Activiti/Flowable 深入BPM工作流》-如何設置local流程變量?
一. 問題:
1. 什麼是local流程變量?
2. 如何設置local流程變量?
3.Local變量設置後成功與否, 如何測試?
二. 詳情
1. 什麼是local流程變量?
解答: 流程變量默認作用域是一個流程實例(processInstance), 也可以是一個任務(task)或一個執行實例(execution). 這三個作用域流程實例的範圍最大,成Global變量.
任務和執行實例僅僅是針對一個任務和一個執行實例範圍,範圍沒有流程實例大,成爲local變量.所以local流程變量是包含(一個任務或一個執行實例)
特點:
1. global變量中變量名不能重複. 設置相同名稱的變量,後設置的值會覆蓋前面的變量值.
2. Local變量名可以重複,也可以和global名相同. local變量由於在不同任務或不同的執行實例中, 作用域互不影響,變量名可以相同,沒有影響.
// 辦理任務時設置local流程變量
@Test
public void completTask() {
//任務id
String taskId = "";
TaskService taskService = processEngine.getTaskService();
// 定義流程變量
Map<String, Object> variables = new HashMap<String, Object>();
Holiday holiday = new Holiday ();
holiday.setNum(3);
// 定義流程變量
Map<String, Object> variables = new HashMap<String, Object>();
//變量名是holiday,變量值是holiday對象
variables.put("holiday", holiday);
// 設置local變量,作用域爲該任務
taskService. setVariablesLocal(tasked, variables );
taskService.complete(taskId);
}
2. 如何通過當前任務設置local變量?
解答: 具體實現code如下
@Test
public void setLocalVariableByTaskId(){
//當前待辦任務id
String taskId="1404";
TaskService taskService = processEngine.getTaskService();
Holiday holiday = new Holiday ();
holiday.setNum(3);
//通過任務設置流程變量
taskService.setVariableLocal(taskId, "holiday", holiday);
//一次設置多個值
//taskService.setVariablesLocal(taskId, variables)
}
注意: 任務id必須是當前任務id, act_ru_task中存在的.
3.Local變量設置後成功與否, 如何測試?
方法一:
local變量在任務結束後無法在當前流程實例中執行使用,如果後續的流程執行需要用到此變量則會報錯.
方法二:
在部門經理審覈,總經理審覈,人事經理審覈是設置local變量,可通過HistoryService查詢每個歷史任務時將流程變量的值查詢出來
// 創建歷史任務查詢對象
HistoricTaskInstanceQuery historicTaskInstanceQuery =
historyService
.createHistoricTaskInstanceQuery();
// 查詢結果包括 local變量
historicTaskInstanceQuery.includeTaskLocalVariables();
for (HistoricTaskInstance historicTaskInstance : list) {
System.out.println("==============================");
System.out.println(" 任 務 id : " +
historicTaskInstance.getId());
System.out.println(" 任 務 名 稱 : " +
historicTaskInstance.getName());
System.out.println(" 任 務 負 責 人 : " +
historicTaskInstance.getAssignee());
System.out.println(" 任 務 local 變 量 : "+
historicTaskInstance.getTaskLocalVariables());
}
注意:查詢歷史流程變量,特別是查詢 pojo 變量需要經過反序列化,不推薦使用。