工作流Activiti5流程變量 任務變量 setVariables 和 setVariablesLocal區別


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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM