《Activiti/Flowable 深入BPM工作流》-什麼是流程變量?
一. 問題:
1. 什麼是流程變量?
2. 什麼是global流程變量, local變量?
3.當前流程實例如何設置?
二. 詳情
1. 什麼是流程變量?
解答: 流程 的運轉需要靠流程變量,業務系統和activiti結合, 流程變量就是在activiti管理工作流是根據管理需要而設置的變
量.例如在請假流程流轉時,請假大於三天則由總經理審覈,否則由人事直接審覈,請假天數就可以設置爲流程變量,在流程流轉時使
用.
注意:
1.1. 爲什麼不建議通過activiti的api查詢流程變量來實現業務查詢?
解答: 雖然流程變量中可用存儲業務數據,可用通過activiti的api查詢流程變量從而實現 查詢業務數據, 但是不建議這麼使用, 因爲業務數據查詢由業務系統負責,
activiti設置流程變量是爲了流程執行需要而創建的.
1.2. 爲什麼用pojo存儲到流程變量,一定要實現序列化接口Serializable?
解答: 爲了防止由於新增字段無法反序列化,需要生產serialVersionID.
1.3. 流程變量的作用域有哪些?
流程變量默認作用域是一個流程實例(processInstance), 也可以是一個任務(task)或一個執行實例(execution). 這三個作用域流程實例的範圍最大,成Global變量.
任務和執行實例僅僅是針對一個任務和一個執行實例範圍,範圍沒有流程實例大,成爲local變量.
特點:
1. global變量中變量名不能重複. 設置相同名稱的變量,後設置的值會覆蓋前面的變量值.
2. Local變量名可以重複,也可以和global名相同. local變量由於在不同任務或不同的執行實例中, 作用域互不影響,變量名可以
相同,沒有影響.
2. 什麼是global流程變量? global流程變量 案例
請假流程
(1). 需求
員工創建請假申請單, 由部門經理審覈,部門經理審覈通過三天及三天以下由人事經理直接審覈, 否則由總經理審覈, 總經理審覈通過再由人事經理存檔.
流程圖如下: holiday.bpmn
(2). 流程定義
請假大於等於三天連線條件:
請假天數小於三天連線條件:
(3). 設置global流程變量:
在部門經理審覈設置流程變量, 變量值爲請假單信息(包括請假天數),部門經理審覈後可根據流程變量的值來覺得流程走向.
下面是具體的code實現
holiday.bpmn部署,啓動及任務辦理設置.
// 新的請假流程定義的部署
public static void main(String[] args) {
// 1. 得到 processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 得到 RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 部署
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("holiday.bpmn")
// .addClasspathResource("studentHoliday.png")
.name("請假流程2020-5-20")
.deploy();
System.out.println(deploy.getId());
System.out.println(deploy.getName());
System.out.println(deploy.getKey());
}
// 啓動流程實例,同時還要設置流程變量的值
public static void main(String[] args) {
// 1. 得到 processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.得到 RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3.流程定義的key問題.
String processDefinitionKey = "myProcess_1";
// 初始化
Map<String, Object> map = new HashMap<String, Object>();
Holiday holiday = new Holiday();
holiday.setNum(5F);
holiday.setHolidayName("請假審批 2020-5-20");
map.put("holiday", holiday);
// 4.啓動流程實例,兵器而設置變量的值
//runtimeService.startProcessInstanceByKey("myProcess_1");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey,map);
// 5.輸出實例信息;
System.out.println(processInstance.getName());
System.out.println(processInstance.getProcessDefinitionId());
System.out.println(processInstance.getId());
}
任務變量是設置
在完成任務是設置流程變量, 流程變量只有在該流程完成後其他節點纔可能使用該變量,它的作用域是整個流程實例,如果設置的流程變量的key在流程實例中已經存在相同名字,則後設置的變量覆蓋前面設置的變量.
這裏需要在創建請假單任務完成(以下是通過當前任務id設置任務的)
// 處理任務---zhangsan / lisi --判斷流程變量的請假天數, 目前是1天-->分支:人事經理
public static void main(String[] args) {
// 1. 得到 processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.得到 TaskService
TaskService taskService = processEngine.getTaskService();
// 3. 查詢當前用戶是否有任務
String taskId = "2508";
// String key="myProcess_1";
// Task task = taskService.createTaskQuery()
// .processDefinitionKey(key)
// .taskAssignee("zhangsan").singleResult();
Map<String, Object> map = new HashMap<String, Object>();
Holiday holiday = new Holiday();
holiday.setNum(2F);
holiday.setHolidayName("請假審批 2020-5-19");
map.put("holiday", holiday);
// 4. 判斷task!=null,說明當前用戶有任務
if(taskId!=null){
taskService.complete(taskId,map);
System.out.println("任務執行完成");
}
}
3. 當前流程實例如何設置?
解答: 需要通過當前任務設置流程變量, 需要指定當前任務id, 如果當前執行的任務id不存在則拋出異常. 任務辦理時也是通過map<key,value>設置流程變量,一次可以設置多個變量.
通過流程實例id設置全局變量, 該流程實例必須是未執行完成的.
public void setGlobalVariableByExecutionId(){
//當前流程實例執行 id,通常設置爲當前執行的流程實例
String executionId="2501";
RuntimeService runtimeService = processEngine.getRuntimeService();
Holiday holiday = new Holiday();
holiday.setNum(3);
//通過流程實例 id設置流程變量
runtimeService.setVariable(executionId, "holiday", holiday);
//一次設置多個值
//runtimeService.setVariables(executionId, variables)
}
注意:
executionId必須當前未結束的流程實例的執行id,通常用此id設置流程實例的id,
當然也可以通過RuntimeService.getVariable()獲取流程變量.