1.流程变量
在流程执行或者任务执行的过程中,用于设置和获取变量,使用流程变量在流程传递的过程中传递业务参数。
对应的表:
act_ru_variable:正在执行的流程变量表
act_hi_varinst:流程变量历史表
2.setVariable和setVariableLocal的区别
setVariable:设置任务变量的时候,任务变量名称相同的时候,后一次的值替换前一次的值. (可以看到TASK_ID的字段不会存放任务ID的值)
setVariableLocal:设置任务变量的时候,如果一个流程中存在2个活动节点,任务节点中相同变量互不影响, 不会相互替换. (可以看到TASK_ID的字段会存放任务ID的值)。
3. 作用域
流程设置local 是针对当前execution分支的, task设置local 是针对本task的
4. 获取变量值为空
instance.getProcessVariables()为什么为空
flowable自己实现了一个命令模式,命令模式的好处是可以在执行命令前打开环境,命名结束后关闭环境。
很不幸的是,flowable是通过这种方式,打开jdbc和关闭jdbc的。 所以,一旦关闭jdbc,也就是执行cmd后,就不能操作数据库里,它没有hibernate那种OpenSessionInVIew的功能。
所以,你必须在cmd执行完之前,告诉flowable,需要取变量,否则它根本就不会去搜索,不发sql,就算数据库里有变量,也取不出来啊。
告诉flowable的方式,就是通过includeProcessVariables。
比如
//就有变量
runtimeService.createProcessInstanceQuery().includeProcessVariables().list();
//就没变量
runtimeService.createProcessInstanceQuery().list();
设置task变量也需要注意, 两种方式
1. 直接设置
runtimeService.setVariablesLocal(instance.getId(),variables);
2.完成任务,同时设置任务的局部变量
// 完成任务, scope 要设置为true , (true为局部,false为全局 [ 默认 ])
taskService.complete(taskId, paramMap, true);
scope为true时, act_hi_varinst表数据

5. 查询变量值
//通过task查询
HistoricTaskInstance hisTask = historyService.createHistoricTaskInstanceQuery()
.taskId(hisTaskId)
.includeProcessVariables()
.includeTaskLocalVariables()
.singleResult();
String executionId = hisTask.getExecutionId();
Map<String, Object> localMap = hisTask.getTaskLocalVariables();
log.info(localMap );
//通过值查询
HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery()
.taskId(hisTaskId)
.executionId(executionId)
.variableName(key).singleResult();
String resultJson = (String) historicVariableInstance.getValue();
7365

被折叠的 条评论
为什么被折叠?



