Flowable 设置流程变量的四种方式

您所在的位置:网站首页 flowable启动流程很慢 Flowable 设置流程变量的四种方式

Flowable 设置流程变量的四种方式

2023-11-12 06:54| 来源: 网络整理| 查看: 265

在之前的文章中,松哥也有和小伙伴们使用过流程变量,然而没有和大家系统的梳理过流程变量的具体玩法以及它对应的数据表详情,今天我们就来看看 Flowable 中流程变量的详细玩法。

1. 为什么需要流程变量

首先我们来看看为什么需要流程变量。

举一个简单的例子,假设我们有如下一个流程:

图片

这是一个请假流程,那么谁请假、请几天、起始时间、请假理由等等,这些都需要说明,不然领导审批的依据是啥?那么如何传递这些数据,我们就需要流程变量。

2. 流程变量的分类

整体上来说,目前流程变量可以分为三种类型:

全局流程变量:在整个流程执行期间,这个流程变量都是有效的。

本地流程变量:这个只针对流程中某一个具体的 Task(任务)有效,这个任务执行完毕后,这个流程变量就失效了。

临时流程变量:顾名思义就是临时的,这个不会存入到数据库中。

在接下来的内容中,我会跟大家挨个介绍这些流程变量的用法。

3. 全局流程变量

假设我们就是上面这个请假流程,我们一起来看下流程变量的设置和获取。

3.1 启动时设置

第一种方式,就是我们可以在流程启动的时候,设置流程变量,如下:

@Testvoid test01(){ Map variables = new HashMap(); variables.put("days", 10); variables.put("reason", "休息一下"); variables.put("startTime", new Date()); ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo01", variables); logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());}

我们可以在启动的时候为流程设置变量,小伙伴们注意到,流程变量的 value 也可以是一个对象(不过这个对象要能够序列化,即实现了 Serializable 接口),然后在启动的时候传入这个变量即可。

我们在流程启动日志中搜索 休息一下 四个字,可以找到和流程变量相关的 SQL,一共有两条,如下:

insert into ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) , ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) , ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )

INSERT INTO ACT_RU_VARIABLE (ID_, REV_, TYPE_, NAME_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_) VALUES ( ?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) , ( ?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) , ( ?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )

从标名称上大概就能看出来,ACT_HI_VARINST 是存储流程执行的历史信息的,ACT_RU_VARIABLE 则是保存流程运行时候的信息的。

我们打开 ACT_RU_VARIABLE 表来看一下:

图片

从表中我们可以看到,每一个流程变量都有对应的流程实例 ID,这就说明这些流程变量是属于某一个流程实例的,所以我们可以按照如下方式来查询流程变量:

@Testvoid test01(){ List list = runtimeService.createExecutionQuery().list(); for (Execution execution : list) { Object reason = runtimeService.getVariable(execution.getId(), "reason"); logger.info("reason:{}", reason); }}

对应的查询 SQL 如下:

: ==> Preparing: select * from ACT_RU_VARIABLE WHERE EXECUTION_ID_ = ? AND TASK_ID_ is null AND NAME_ = ?: ==> Parameters: 6fdd2007-4c3a-11ed-aa7e-acde48001122(String), reason(String): Preparing: select * from ACT_RU_VARIABLE WHERE EXECUTION_ID_ = ? AND TASK_ID_ is null : ==> Parameters: 6fdd2007-4c3a-11ed-aa7e-acde48001122(String) :


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3