setVariables 和 setVariablesLocal區別?
1.流程變量
在流程執行或者任務執行的過程中,用於設置和獲取變量,使用流程變量在流程傳遞的過程中傳遞業務參數。
對應的表:
act_ru_variable:正在執行的流程變量表
act_hi_varinst:流程變量歷史表
2.setVariable和setVariableLocal的區別
setVariable:設置流程變量的時候,流程變量名稱相同的時候,后一次的值替換前一次的值,而且可以看到TASK_ID的字段不會存放任務ID的值
setVariableLocal:
1)設置流程變量的時候,針對當前活動的節點設置流程變量,如果一個流程中存在2個活動節點,對每個活動節點都設置流程變量,即使流程變量的名稱相同,后一次的版本的值也不會替換前一次版本的值,它會使用不同的任務ID作為標識,存放2個流程變量值,而且可以看到TASK_ID的字段會存放任務ID的值。
例如act_hi_varinst 表的數據:不同的任務節點,即使流程變量名稱相同,存放的值也是不同的。
2)還有,使用setVariableLocal說明流程變量綁定了當前的任務,當流程繼續執行時,下個任務獲取不到這個流程變量(因為正在執行的流程變量中沒有這個數據),所有查詢正在執行的任務時不能查詢到我們需要的數據,此時需要查詢歷史的流程變量。
可以簡單認為,variable都是針對processInstance的。
local可能是針對某個execution分支的,也可能針對task的。
這里就要談一下變量的作用域,變量肯定是依附於某個流程里的概念而存在的,所以才能在流程流轉過程中使用這些變量。
默認的變量都是流程實例級別的,也就是說,分支execution和task都可以讀取到對應processInstance里的變量。
與之相對的就是local變量,簡單來說就不是processInstance范圍的變量,如何區分global和local呢?差別就是local的作用范圍小,如果是分支execution的local變量,就只能在execution分支生存期使用。
比如並發分支結束了,變量也就沒了
比如task結束了,變量也就沒了。
local變量的好處是,可以在每個分支使用同名的變量,互相之間不受影響,會簽multi-instance就是通過local局部變量實現的。
流程實例結束完成以后流程變量還保存在數據庫中(存放到流程變量的歷史表中)。
1)流程變量的作用域就是流程實例,所以只要設置就行了,不用管在哪個階段設置
2)基本類型設置流程變量,在taskService中使用任務ID,定義流程變量的名稱,設置流程變量的值
3)Javabean類型設置流程變量,需要這個javabean實現了Serializable接口
4)設置流程變量的時候,向act_ru_variable這個表添加數據
5)流程變量的獲取針對流程實例(1個流程),每個流程實例獲取的流程變量是不同的
6)使用基本類型獲取流程變量,在taskService中使用任務ID,流程變量的名稱,獲取流程變量的值。
7)Javabean類型設置獲取流程變量,除了需要這個javabean實現了Serializable接口外,還要求流程變量對象的屬性不能發生變化,否則拋出異常。解決方案,固定序列化ID
設置流程變量
1 /** 2 * 功能: 設置流程變量.<br/> 3 * date: 2014年12月23日 下午3:58:36 <br/> 4 * 5 * @author xzzhao@wisdombud.com 6 */ 7 @Test 8 public void setVariables() { 9 TaskService taskService = processEngine.getTaskService(); 10 // 任務Id 11 String taskId = "2704"; 12 /** 1.使用基本數據類型設置流程變量 **/ 13 taskService.setVariableLocal(taskId, "請假天數", 3); // 與任務ID綁定 14 taskService.setVariable(taskId, "請假日期", new Date()); 15 taskService.setVariable(taskId, "請假原因", "回家養病,大概一周把!"); 16 /** 2.使用Javabean類型設置流程變量 **/ 17 User user = new User(); 18 user.setId(10); 19 user.setName("小紅"); 20 taskService.setVariable(taskId, "用戶信息", user); 21 System.out.println("設置成功!"); 22 }
獲取流程變量
1 /** 2 * 功能: 獲取流程變量.<br/> 3 * date: 2014年12月23日 下午3:59:11 <br/> 4 * 5 * @author xzzhao@wisdombud.com 6 */ 7 @Test 8 public void getVariables() { 9 TaskService taskService = processEngine.getTaskService(); 10 // 任務Id 11 String taskId = "2204"; 12 /** 1.基本數據類型獲取流程變量 */ 13 Integer days = (Integer) taskService.getVariable(taskId, "請假天數"); 14 Date date = (Date) taskService.getVariable(taskId, "請假日期"); 15 String comment = (String) taskService.getVariable(taskId, "請假原因"); 16 System.out.println("請假天數:" + days + "\n 請假日期:" + date + "\n 請假原因:" + comment); 17 /** 2.Javabean類型獲取流程變量 */ 18 User u = (User) taskService.getVariable(taskId, "用戶信息"); 19 System.out.println("id:" + u.getId() + " name:" + u.getName()); 20 }
模擬設置和獲取流程變量
1 /** 2 * 功能: 模擬設置和獲取流程變量.<br/> 3 * date: 2014年12月23日 下午4:00:11 <br/> 4 * 5 * @author xzzhao@wisdombud.com 6 */ 7 @Test 8 public void setAndGetVariables() { 9 RuntimeService runtimeService = processEngine.getRuntimeService(); 10 11 TaskService taskService = processEngine.getTaskService(); 12 13 /** 設置流程變量 **/ 14 // runtimeService.setVariable(executionId, variableName, value); 15 // runtimeService.setVariables(executionId, variables); 16 17 // taskService.setVariable(taskId, variableName, value); 18 // 使用任務Id,和流程變量的名稱,設置流程變量的值 19 // taskService.setVariables(taskId, variables);使用任務Id,和Map集合設置流程變量,設置多個值 20 21 // runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);啟動流程實例的同時,可以設置流程變量,使用Map集合 22 // taskService.complete(taskId, variables);完成任務的同時,設置流程變量,使用Map集合 23 24 /** 獲取流程變量 **/ 25 // runtimeService.getVariable(executionId,variableName);使用執行對象Id和流程變量名稱,獲取值 26 // runtimeService.getVariables(executionId);使用執行對象Id,獲取所有的流程變量,返回Map集合 27 // runtimeService.getVariables(executionId,variableNames);使用執行對象Id,獲取流程變量的值,通過設置流程變量的名稱存放到集合中,獲取指定流程變量名稱的流程變量的值,值存放到Map中 28 29 // taskService.getVariable(taskId,variableName);使用任務Id和流程變量名稱,獲取值 30 // taskService.getVariables(taskId);使用任務Id,獲取所有的流程變量,返回Map集合 31 // taskService.getVariables(taskId,variableNames);使用任務Id,獲取流程變量的值,通過設置流程變量的名稱存放到集合中,獲取指定流程變量名稱的流程變量的值,值存放到Map中 32 }
說明:
1)RuntimeService對象可以設置流程變量和獲取流程變量
2)TaskService對象也可以設置流程變量和獲取流程變量
3)流程實例啟動的時候可以設置流程變量
4)任務辦理完成的時候可以設置流程變量
5)流程變量可以通過名稱/值的形式設置單個流程變量
6)流程變量可以通過Map集合,同時設置多個流程變量,Map集合的key表示流程變量的名稱,value表示流程變量的值
查詢歷史的流程變量
1 /** 2 * 功能: 查詢歷史的流程變量.<br/> 3 * date: 2015年1月4日 下午4:42:17 <br/> 4 * 5 * @author xzzhao@wisdombud.com 6 */ 7 @Test 8 public void findHistoryProcessVariables() { 9 List<HistoricVariableInstance> list = processEngine.getHistoryService()// 10 .createHistoricVariableInstanceQuery() // 創建一個歷史的流程變量查詢對象 11 .variableName("請假天數").list(); 12 if (null != list && list.size() > 0) { 13 for (HistoricVariableInstance hvi : list) { 14 System.out.println(hvi.getId() + " " + hvi.getProcessInstanceId() + " " + hvi.getVariableName() + " " 15 + hvi.getVariableTypeName() + " " + hvi.getValue()); 16 System.out.println("###################################"); 17 } 18 } 19 }
還看參看:http://www.kafeitu.me/activiti/2012/05/18/let-activiti-record-variables-to-history.html