flowable的流程变量设置setVariables 和 setVariablesLocal区别?

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();

<think> 首先,用户查询是关于Flowable工作流引擎的:"我想查找获取flowable流程变量的方法 请问如何获取flowable流程变量"。用户指定了参考站内引用,我需要基于提供的引用[1][^1]来回答。 回顾引用内容: - 引用[1]: Flowable-任务分配流程变量流程实例按步骤执行时,需要使用一些数据。在Flowable中,这些数据称作变量(variable),并会存储在数据库中。变量可以用在表达式中(例如在排他网关中用于选择正确的出口路径),也可以在Java服务任务(service task)中用于调用外部服务(例如为服务调用提供输入或结果存储),等等。[^1] - 引用[^2]: flowable流程变量的概念(作用域)。当通过getVariable(variableName)(不带Local) 方法(无论是在 RuntimeService 还是 TaskService 上)查询一个变量时,Flowable 会按照以下从具体到宽泛的作用域顺序查找:[^2]。 (注意:原文中是[^2],但用户输入中是引用[2],可能是个小错误,我应该统一处理为引用标识。) 用户说:"上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题你的回答"。但在对话历史中,这是用户的第一个问题,没有上一个问题。查看对话历史: - 系统级指令是固定的。 - 然后用户的问题:"参考站内引用:..."接着查询。 所以,我需要专注于当前查询。用户要求"尽可能多的参考用户上一次的问题",但这里没有上一次问题,因为是第一次交互。因此,我应该基于当前查询提供的引用来回答。 关键点:用户问"如何获取flowable流程变量",而引用中提到了获取变量的方法。 从引用[2]中:它描述了一个方法:通过getVariable(variableName)方法来查询变量;可以在RuntimeService或TaskService上使用。 我需要扩展这个内容。虽然引用提供了基础,但作为AI,我应该提供更全面的回答,基于我的知识。Flowable是基于Java的工作流引擎,是Activiti的一个分支。 获取流程变量的常见方法: 1. 在流程实例级别:使用RuntimeService。 2. 在任务级别:使用TaskService。 3. 使用表达式在BPMN模型中。 具体方法: - 使用RuntimeService.getVariable(executionId, variableName) - 使用RuntimeService.getVariableLocal(executionId, variableName) 用于本地作用域。 - 使用TaskService.getVariable(taskId, variableName) - 使用TaskService.getVariableLocal(taskId, variableName) 引用[2]提到了getVariable方法的作用域顺序:从具体到宽泛,比如任务变量优先于执行上下文变量。 答案应该: - 使用中文回答。 - 结构清晰。 - 在行内数学表达式或公式使用$...$,但这里可能不需要数学表达式。 - 独立公式用$$...$$,但这里没有公式。 - 生成相关问题。 - 引用段落末尾添加引用标识。 构建回答: 1. 解释流程变量的概念(基于引用)。 2. 列出获取流程变量的方法。 3. 举例说明。 4. 添加引用标识。 5. 生成相关问题。 引用标识:用户提供了[^1][^2],所以在相应段落末尾添加它们。 最终回答结构: - 介绍Flowable流程变量。 - 描述获取方法。 - 可能给出代码示例。 - 生成相关问题。 相关问题: - 类似于示例,例如: 1. 流程变量的作用域是什么? 2. 如何设置Flowable流程变量? 3. Flowable变量有哪些类型? 确保回答真实可靠:基于Flowable文档,我可以确认这些方法。 </think> ### Flowable流程变量获取方法 在Flowable工作流引擎中,流程变量(variable)用于存储流程执行过程中的数据,如任务处理结果或决策参数,这些变量持久化在数据库中,可以在表达式、服务任务或网关路径选择中使用[^1]。获取流程变量的核心方法是基于Flowable的服务接口(如`RuntimeService`或`TaskService`),通过Java API操作。以下是获取流程变量的详细方法步骤,确保代码语法正确(使用Java示例): #### 1. **获取流程变量的基本方法** Flowable提供了两种主要的服务接口来查询变量: - **`RuntimeService`**: 用于流程实例级别的变量操作,适用于整个流程执行上下文。 - **`TaskService`**: 用于任务级别的变量操作,适用于特定任务节点。 当通过`getVariable(variableName)`方法(不带`Local`后缀)查询变量时,Flowable会按照从具体到宽泛的作用域顺序查找变量值: - 首先检查任务变量(如果存在任务上下文)。 - 其次检查执行上下文变量。 - 最后检查父级流程变量[^2]。 示例获取方法: - **使用`RuntimeService`获取流程实例变量**: ```java // 获取RuntimeService实例(通常通过ProcessEngine初始化) RuntimeService runtimeService = processEngine.getRuntimeService(); // 指定流程实例ID变量名获取变量 Object variableValue = runtimeService.getVariable(executionId, "variableName"); // 获取本地变量(仅限当前执行作用域) Object localVariableValue = runtimeService.getVariableLocal(executionId, "localVariableName"); ``` 这种方法适用于在流程启动或服务任务中全局访问变量。 - **使用`TaskService`获取任务变量**: ```java // 获取TaskService实例 TaskService taskService = processEngine.getTaskService(); // 指定任务ID变量名获取变量 Object variableValue = taskService.getVariable(taskId, "variableName"); // 获取本地变量(仅限当前任务作用域) Object localVariableValue = taskService.getVariableLocal(taskId, "localVariableName"); ``` 这种方法适用于在用户任务处理时访问任务相关变量。 在这些方法中: - `variableName`是变量名称(字符串类型)。 - `executionId`是流程执行ID(通过`Execution`对象获取)。 - `taskId`是任务实例ID(通过任务查询接口获取)。 - 变量值返回为`Object`类型,需根据需要强制转型(如Integer、String或自定义对象)。 #### 2. **作用域优先级说明** - **变量作用域**:Flowable变量分为全局变量流程实例级)本地变量(任务或执行级)。本地变量优先于全局变量返回[^2]。 - 例如,在排他网关表达式中,变量可以直接用于决策:`${variableName > 10}`。 - **数据类型处理**:Flowable支持基本类型(如String、Integer)自定义Java对象(需实现Serializable接口)。如果变量未找到,方法返回`null`。 - **高效查询**:建议优先使用`getVariableLocal`方法查询本地变量,以减少数据库开销。 #### 3. **完整获取流程变量的步骤** 在实际项目中,获取流程变量的典型流程如下: 1. **初始化ProcessEngine**: 使用Flowable配置创建引擎实例。 2. **获取服务接口**: 调用`getRuntimeService()`或`getTaskService()`。 3. **查询变量**: 基于上下文(流程实例或任务)调用`getVariable()`方法。 4. **处理变量值**: 在业务逻辑中使用变量。 示例代码片段(汇总): ```java import org.flowable.engine.ProcessEngine; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.ProcessEngineConfiguration; public class FlowableVariableExample { public static void main(String[] args) { // 初始化ProcessEngine ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration().buildProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); TaskService taskService = processEngine.getTaskService(); // 假设有一个正在运行的流程实例任务 String executionId = "execution123"; // 从数据库中获取或运行时设置 String taskId = "task456"; // 获取全局变量 String globalVar = (String) runtimeService.getVariable(executionId, "globalVariable"); System.out.println("全局变量值: " + globalVar); // 获取任务变量(本地作用域优先) Integer taskVar = (Integer) taskService.getVariable(taskId, "taskVariable"); System.out.println("任务变量值: " + taskVar); } } ``` #### 4. **注意事项** - **变量存储**:所有变量存储在Flowable数据库的`ACT_RU_VARIABLE`表中,可通过查询API或数据库直接访问。 - **性能考虑**:频繁调用`getVariable()`可能增加数据库负载,建议在服务任务或监听器中批量处理变量。 - **错误处理**:如果变量名不存在或作用域错误,方法返回`null`,需添加空值检查以避免异常。 通过上述方法,您可以轻松获取Flowable流程变量,支持动态流程控制服务集成。更多细节可参考Flowable官方文档[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值