工作流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