流程變量在整個工作流中扮演很重要的作用
例如:請假流程中有請假天數、請假原因等一些參數都為流程變量的范圍。流程變量的作用域范圍是流程實例。也就是說各個流程實例的流程變量是不相互影響的。
添加流程變量
1、在啟動流程實例時,可以添加流程變量。
public void startProcess() throws Exception { String processDefinitionKey ="varTest"; // 創建流程變量 Map<String,Object> variables = new HashMap<String,Object>(); variables.put("請假人", "馮小剛"); // 在啟動時設置流程變量 ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey , variables ); System.out.println("pid:" + pi.getId()); }
說明:
1) 在啟動流程實例時,通過重載startProcessInstanceByKey的方法可以加載流程變量。
2) 第二個參數要求是Map<String ,Object>類型,意味着可以添加多個流程變量。
3) 當這段代碼執行完以后,會在數據庫表act_ru_variable中添加兩行記錄。
2、在辦理任務時
在辦理任務時,有時候任務辦理完成以后,要傳遞一些信息到系統中。這個時候可以利用TaskService這個類來添加流程實例。
public void setVar() throws Exception { String processInstanceId = "1901"; Task task =taskService.createTaskQuery().taskAssignee("manager").processInstanceId(processInstanceId ).singleResult(); // String taskId /** * 在辦理過程中設置流程變量 */ // taskService.setVariable(taskId, variableName, value) // 設置一個流程變量 Map<String, Object> variables = new HashMap<>(); // variables.put("請假時間", "2013-11-22"); // variables.put("請假天數", "3"); variables.put("請假天數", 3); taskService.setVariables(task.getId(), variables ); /** * 在任務完成時設置流程變量 */ // taskService.complete(taskId) // Map<String, Object> variables = new HashMap<>(); // variables.put("請假原因", "約會!!"); // taskService.complete(task.getId(), variables); }
說明:
1) 利用setVariables方法在任務辦理過程中添加一批流程變量。
2) 利用setVariable方法在任務辦理過程中添加一個流程變量。
3) TaskService有一個重載 complete方法
3、執行流程實例時直接在Execution上設置流程變量
因為流程變量的作用域就是流程實例,所以只要設置就行了,不用管在哪個階段
public void setVarByExecution() throws Exception { String processInstanceId = "1901"; Task task =taskService.createTaskQuery().taskAssignee("manager").processInstanceId(processInstanceId ).singleResult(); // String taskId /** * 在辦理過程中設置流程變量 */ // taskService.setVariable(taskId, variableName, value) // 設置一個流程變量 Map<String, Object> variables = new HashMap<>(); variables.put("批注", "好好約會,注意安全!!"); runtimeService.setVariables(task.getExecutionId(), variables); /** * 在任務完成時設置流程變量 */ // taskService.complete(taskId) // Map<String, Object> variables = new HashMap<>(); // variables.put("請假原因", "約會!!"); // taskService.complete(task.getId(), variables); }
另一種設置變量的方法:
public void setVarByObj() throws Exception { String processInstanceId = "1901"; Task task =taskService.createTaskQuery().taskAssignee("manager").processInstanceId(processInstanceId ).singleResult(); Form form = new Form();//這個javabean實現了Serializable接口
form.setName("表單名稱");
form.setContent("我是張三,我要請假3天"); taskService.setVariable(task.getId(), "form", form); }
獲取流程變量
可以通過runTimeService的方法來獲取流程變量。
public void viewVar() throws Exception { String processInstanceId = "1901"; Task task =taskService.createTaskQuery().taskAssignee("user").processInstanceId(processInstanceId ).singleResult(); System.out.println("taskName:" + task.getName()); // String variableName = "請假人"; // String val = (String)taskService.getVariable(task.getId(), variableName ); Map<String,Object> vars = taskService.getVariables(task.getId()); for (String variableName : vars.keySet()) { String val = (String) vars.get(variableName); System.out.println(variableName + " = " +val); } }
說明:這些流程變量是從act_ru_variable這個表中讀出來的。