(六)、Activiti 流程變量
(六)、Activiti 流程變量
一、什么是流程變量
官網介紹: https://www.activiti.org/userguide/#apiVariables
流程變量在 activiti 中是一個非常重要的角色,流程運轉有時需要靠流程變量,業務系統和 activiti結合時少不了流程變量,流程變量就是 activiti 在管理工作流時根據管理需要而設置的變量。
比如在請假流程流轉時如果請假天數大于 3 天則由總經理審核,否則由人事直接審核,請假天數就可以設置為流程變量,在流程流轉時使用。
注意:雖然流程變量中可以存儲業務數據可以通過 activiti 的 api 查詢流程變量從而實現 查詢業務數據,但是不建議這樣使用,因為業務數據查詢由業務系統負責,activiti 設置流程變量是為了流程執行需要而創建。
二、流程變量類型
String、Integer、short、long、double、boolean、date、binary、serializable。
注意:如果將 pojo 存儲到流程變量中,必須實現序列化接口 serializable,為了防止由于新增字段無法反序列化,需要生成 serialVersionUID。
三、流程變量作用域
流程變量的作用域默認是一個流程實例(processInstance),也可以是一個任務(task)或一個執行實例(execution),這三個作用域流程實例的范圍最大,可以稱為 global 變量,任務和執行實例僅僅是針對一個任務和一個執行實例范圍,范圍沒有流程實例大,稱為 local 變量。
- global 變量中變量名不允許重復,設置相同名稱的變量,后設置的值會覆蓋前設置的變量值。
- Local 變量由于在不同的任務或不同的執行實例中,作用域互不影響,變量名可以相同沒有影響。
- Local 變量名也可以和 global 變量名相同,沒有影響。
四、流程變量使用方法
- 第一步:設置流程變量
- 第二步:通過 UEL 表達式使用流程變量
可以在 assignee 處設置 UEL 表達式,表達式的值為任務的負責人。比如:${assignee},assignee 就是一個流程變量名稱
Activiti 獲取 UEL 表達式的值 ,即流程變量 assignee 的值 ,將 assignee 的值作為任務的負責人進行任務分配
可以在連線上設置 UEL 表達式,決定流程走向。
比如:${price>=10000}和${price<10000}: price 就是一個流程變量名稱,uel 表達式結果類型為布爾類型。如果 UEL 表達式是 true,要決定 流程執行走向。
1、在啟動流程時設置流程變量,變量的作用域是整個流程實例。
通過 map設置流程變量,map 中可以設置多個變量,這個 key 就是流程變量的名字。
//啟動流程實例,同時還要設置流程變量的值
// act_ge_bytearray
// act_ru_variable
@Test
public void process1( ) {
//1.得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//3.流程定義的key問題 myProcess_1
String key = "holiday";
Map<String ,Object> map = new HashMap<>();
Holiday holiday = new Holiday();
holiday.setNum(5);
map.put("holidayObject",holiday);
//4.啟動流程實例,并且設置流程變量的值
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key, map);
//5.輸出實例信息
System.out.println(processInstance.getName());
System.out.println(processInstance.getProcessDefinitionId());
}
2、任務辦理時設置流程變量
在完成任務時設置流程變量,該流程變量只有在該任務完成后其它結點才可使用該變量,它的作用域是整個流程實例,如果設置的流程變量的 key 在流程實例中已存在相同的名字則后設置的變量替換前邊設置的變量。
這里需要在創建請假單任務完成時設置流程變量。
@Test
public void variable2() {
//1.得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到TaskService
TaskService taskService = processEngine.getTaskService();
//3.查詢當前用戶是否有任務
String key = "holiday";
Task task = taskService.createTaskQuery().processDefinitionKey(key)
.taskAssignee("zhangsan").singleResult();
//初始化一些參數
Map<String ,Object> map = new HashMap<>();
Holiday holiday = new Holiday();
holiday.setNum(5);
map.put("holiday",holiday);
//4.判斷task!=null,說明當前用戶有任務
if(task!=null){
taskService.complete(task.getId(),map);//完成任務時,設置流程變量的值
System.out.println("任務執行完畢");
}
}
3、通過當前流程實例設置
通過流程實例 id 設置全局變量,該流程實例必須未執行完成。
// 通過流程實例id,來測試流程變量
public void variable3() {
//1.得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//3.流程定義的key問題 myProcess_1
//Map<String ,Object> map = new HashMap<>();
Holiday holiday = new Holiday();
holiday.setNum(5);
// map.put("holiday",holiday);
//4.通過實例id,來設置流程變量
//第一個參數:流程實例的id
//第二個參數:流程變量名
//第三個變量:流程變量名,所對應的值
runtimeService.setVariable("2501","holiday",holiday);
}
也可以通過 runtimeService.getVariable()獲取流程變量
4、 通過當前任務設置
// 通過任務id設置流程變量,來測試流程變量
public void variable4(){
//當前待辦任務id
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
String taskId="1404";
TaskService taskService = processEngine.getTaskService();
Holiday holiday = new Holiday();
holiday.setNum(3F);
//通過任務設置流程變量
taskService.setVariable(taskId, "holiday", holiday);
//一次設置多個值
//taskService.setVariables(taskId, variables)
}
五、設置 local 流程變量
1 辦理任務時設置
任務辦理時設置 local 流程變量,當前運行的流程實例只能在該任務結束前使用,任務結束該變量無法在當前流程實例使用,可以通過查詢歷史任務查詢。
// 辦理任務時設置local流程變量
@Test
public void variable1() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//任務id
String taskId = "";
TaskService taskService = processEngine.getTaskService();
// 定義流程變量
Map<String, Object> variables = new HashMap<String, Object>();
Holiday holiday = new Holiday();
holiday.setNum(3F);
//變量名是holiday,變量值是holiday對象
variables.put("holiday", holiday);
// 設置local變量,作用域為該任務
taskService.setVariablesLocal(taskId, variables);
taskService.complete(taskId);
}
說明:設置作用域為任務的 local 變量,每個任務可以設置同名的變量,互不影響。
六、數據庫表操作
設置流程變量會在當前執行流程變量表,同時也會在歷史執行變量表插入記錄。
# 當前正在執行的流程變量表
SELECT * FROM act_ru_variable
# 歷史執行流程變量表
SELECT * FROM act_hi_varinst

浙公網安備 33010602011771號