Springboot +Flowable,设置流程变量的方式(一)
一.简介
为什么需要流程变量。
举个例子,假设有如下一个流程,截图如下:

这是一个请假流程,那么谁请假、请几天、起始时间、请假理由等等,这些都需要说明,不然领导审批的依据是啥?那么如何传递这些数据,我们就需要流程变量。
二.流程变量的分类
目前流程变量可以分为三种类型:
- 全局流程变量:在整个流程执行期间,这个流程变量都是有效的。
- 本地流程变量:这个只针对流程中某一个具体的 Task(任务)有效,这个任务执行完毕后,这个流程变量就失效了。
- 临时流程变量:顾名思义就是临时的,这个不会存入到数据库中。
在接下来学习这些流程变量的用法。
三.全局流程变量
按照上面请假流程,我们一起来看下流程变量的设置和获取。
1.启动时设置
第一种方式,就是在流程启动的时候,设置流程变量,代码如下:
@Test
void test01() {Map<String, Object> 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,一共有两条,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 则是保存流程运行时候的信息的。
表数据,截图如下:

从表中可以看到,每一个流程变量都有对应的流程实例 ID,这就说明这些流程变量是属于某一个流程实例的,所以按照如下方式来查询流程变量,代码如下:
@Test
void test01() {List<Execution> 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)
: <== Total: 1
可以看到,这个就是去 ACT_RU_VARIABLE 表中进行查询,查询条件中包含了变量的名称。
当然,也可以直接查询某一个流程的所有变量,代码如下:
@Test
void test02() {List<Execution> list = runtimeService.createExecutionQuery().list();for (Execution execution : list) {Map<String,Object> variables = runtimeService.getVariables(execution.getId());logger.info("variables:{}", variables);}
}
这个对应的查询 SQL语句如下:
: ==> Preparing: select * from ACT_RU_VARIABLE WHERE EXECUTION_ID_ = ? AND TASK_ID_ is null: ==> Parameters: 6fdd2007-4c3a-11ed-aa7e-acde48001122(String): <== Total: 3
可以看到,这个跟上面的那个差不多,只不过少了 NAME_ 这个条件。
2.通过 Task 设置
也可以在流程启动成功之后,再去设置流程变量,步骤如下:
首先启动一个流程,代码如下:
@Test
void test01() {ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo01");logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}
然后设置流程变量,代码如下:
@Test
void test03() {Task task = taskService.createTaskQuery().singleResult();taskService.setVariable(task.getId(), "days", 10);Map<String, Object> variables = new HashMap<>();variables.put("reason", "休息一下");variables.put("startTime", new Date());taskService.setVariables(task.getId(),variables);
}
查询到某一个 Task,然后设置流程变量,上面这段代码演示了两种设置方式:
- 逐个设置
- 直接设置一个 Map
上面这个设置流程变量的方式,本质上还是往 ACT_HI_VARINST 和 ACT_RU_VARIABLE 表中插入数据。具体的 SQL 也和前面的一样。
3.完成任务时设置
可以在完成一个任务的时候设置流程变量,代码如下:
@Test
void test04() {Task task = taskService.createTaskQuery().singleResult();Map<String, Object> variables = new HashMap<>();variables.put("reason", "休息一下");variables.put("startTime", new Date());variables.put("days", 10);taskService.complete(task.getId(),variables);
}
涉及到的 SQL语句 都跟前面一样。
4.通过流程设置
由于是全局流程变量,所以也可以通过 RuntimeService 来进行设置,代码如下:
@Test
void test05() {Execution execution = runtimeService.createExecutionQuery().singleResult();runtimeService.setVariable(execution.getId(), "days", 10);Map<String, Object> variables = new HashMap<>();variables.put("reason", "休息一下");variables.put("startTime", new Date());runtimeService.setVariables(execution.getId(), variables);
}
相关文章:
Springboot +Flowable,设置流程变量的方式(一)
一.简介 为什么需要流程变量。 举个例子,假设有如下一个流程,截图如下: 这是一个请假流程,那么谁请假、请几天、起始时间、请假理由等等,这些都需要说明,不然领导审批的依据是啥?那么如何传递…...
机器学习13(正则化)
文章目录 简介正则化经验风险和结构风险过拟合正则化建模策略 逻辑回归逻辑回归评估器 练习评估器训练与过拟合实验评估器的手动调参 简介 这一节详细探讨关于正则化的相关内容,并就 sklearn 中逻辑回归(评估器)的参数进行详细解释由于 skle…...
并发编程学习(十一):原子数组、
1、数组类型的原子类 原子数组类型,这个其实和AtomicInteger等类似,只不过在修改时需要指明数组下标。 CAS是按照来根据地址进行比较。数组比较地址,肯定是不行的,只能比较下标元素。而比较下标元素,就和元素的…...
递归到动态规划:省去枚举行为
如果在动态规划的过程中没有枚举行为,那严格位置依赖和傻缓存的方式并没有太大区别,但是当有枚举行为的时候(一个位置依赖于多个位置),那严格位置依赖是有优化空间的,枚举行为也许可以省去,题目…...
服务(第二十一篇)mysql高级查询语句(二)
①视图表: 视图表是虚拟表,用来存储SQL语句的定义 如果视图表和原表的字段相同,是可以进行数据修改的; 如果两者的字段不通,不可以修改数据。 语法: 创建:create view 试图表名 as ... 查…...
MYSQL高可用配置(MHA)
1、什么是MHA MHA(Master High Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最大…...
单精度浮点数与十进制数据相互转换
一、float基础: Float类型占4个字节,也就是32bit,其中最高位是符号位,2~9位是指数位,后边的23bit是数值位.如下所示 大部分数据的二进制形式都可以用科学计数法表示,即1.m*2^n这种形式,只要知道m和n,就能确定一个数值 二、小数位如何转变为二进制: 下面…...
PMP敏捷-4大价值观、12原则
宣言及4大价值观 个体及互动 胜于 流程和工具 以人为本 工作的软件 胜于 完整的文档 以价值为导向 客户合作 胜于 合同谈判 合作共赢 应对变更 胜于 遵循计划 拥抱变化 12原则 工作原则:精益、至简,实现这种原则的方式是“定期反省”。9、10、12 …...
K8S—Helm
一、Helm介绍 helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用的部署和管理。 Helm本质就是让k8s的应用管理(Deployment、Service等)可配置,能动态生成。通过动态生成K8S资源清单文件&a…...
ALSA内部函数调用流程
ALSA内部函数调用流程 一直都有这样的一个疑问 就是在linux系统中我们调用snd_pcm_open后,就不知道alsa内部是怎么运行的了 用户的pcm_open()相当于先对ASoC各个驱动模块startup(),再做hw_params()。 pcm_open()pcm->fd open("/dev/snd/pcm…...
Python正则表达式详解,保姆式教学,0基础也能掌握正则
正则作为处理字符串的一个实用工具,在Python中经常会用到,比如爬虫爬取数据时常用正则来检索字符串等等。正则表达式已经内嵌在Python中,通过导入re模块就可以使用,作为刚学Python的新手大多数都听说”正则“这个术语。 今天来给…...
ChatGPT 接入飞书教程,创建自己的聊天机器人
ChatGPT 接入飞书教程,创建自己的聊天机器人 一、飞书进入开发者平台。点击创建应用。二、打开Aircode,点击创建应用,上面输入名字,下面选择Node.js v16三、配置环境,点击Environments,创建四个变量,全部要大写本教程收集于: AIGC从入门到精通教程 首先,准备三个账号…...
JS生成随机数(多种解决方案)
JS生成随机数 概述 随机数是编程语言中的重要组成部分。在JavaScript中,生成随机数是一项简单的任务。本文将介绍生成随机数的各种方法。 Math.random() Math.random()是JavaScript中生成随机数最常见的方法。该方法返回介于0和1之间的随机数。例如,…...
文件IO 函数 静态库和动态库的创建 5.11
5.11 文件IO函数 1.数据读写 ssize_t read(int fd,void *buf,size_t count); 功能: 从fd对应的文件中 读取前count个字节的数据到buf缓冲区中 头文件: #include <unistd.h> 参数: fd :文件描述符 buf…...
考研日语-详解ている、てある、ていく、てくる用法
目录 一、ている用法 1. 表示现在状态 2. 表示持续动作 3. 表示经验或习惯 4. 表示结果或效果 二、てある用法 1. 表示已经完成的动作 2. 表示现在状态 3. 表示被动 三、ていく用法 1. 表示未来的动作 2. 表示逐渐变化的过程 四、てくる用法 1. 表示过去到现在的…...
Spring Security 6.x 系列【36】授权服务器篇之OpenID Connect 1.0
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 本系列Spring Authorization Server 版本 1.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 文章目录 1. 前言2. OpenID Connect…...
【计算机视觉 | Pytorch】timm 包的具体介绍和图像分类案例(含源代码)
一、具体介绍 timm 是一个 PyTorch 原生实现的计算机视觉模型库。它提供了预训练模型和各种网络组件,可以用于各种计算机视觉任务,例如图像分类、物体检测、语义分割等等。 timm 的特点如下: PyTorch 原生实现:timm 的实现方式…...
轻博客Plume的搭建
什么是 Plume ? Plume 是一个基于 ActivityPub 的联合博客引擎。它是用 Rust 编写的,带有 Rocket 框架,以及 Diesel 与数据库交互。前端使用 Ructe模板、WASM 和SCSS。 反向代理 假设我们实际访问地址为: https://plume.laosu.ml…...
机器人关节电机PWM
脉冲宽度调制(Pulse width modulation,PWM)技术。一种模拟控制方式 机器人关节电机的控制通常使用PWM(脉冲宽度调制)技术。PWM是一种用于控制电子设备的技术,通过控制高电平和低电平之间的时间比例,实现对电子设备的控制。在机器人关节电机中,PWM信号可以控制电机的…...
MPU6050详解(含源码)
前言:MPU6050是一款强大的六轴传感器,需要理解MPU6050首先得有IIC的基础,MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个第二 IIC 接口,可用于连接外部磁力传感器,内部有硬件算法支持. 1…...
Houdini VEX实战:5步搞定变形管道的中心线生成(附常见问题修复)
Houdini VEX实战:5步搞定变形管道的中心线生成(附常见问题修复) 在三维动画制作中,处理变形管道的中心线是许多技术美术师面临的常见挑战。无论是角色动画中的血管、机械装置中的电缆,还是科幻场景中的能量管道&#x…...
智能风扇管家:FanControl如何让你的电脑安静又高效
智能风扇管家:FanControl如何让你的电脑安静又高效 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/Fa…...
Cesium.js实战:用自定义Shader给无人机轨迹加上酷炫流动尾线(附完整代码)
Cesium.js实战:用自定义Shader给无人机轨迹加上酷炫流动尾线(附完整代码) 在三维地理信息可视化领域,动态轨迹的表现力直接影响数据传达效率。想象一下,当无人机飞越城市上空时,一条普通的静态线条很难直观…...
从零解析:富斯i6遥控器与STM32的IBUS协议通信实战
1. 为什么选择富斯i6遥控器与STM32通信 对于很多刚接触机器人或者智能小车开发的爱好者来说,无线控制模块的选择往往是个头疼的问题。市面上常见的方案要么价格昂贵,要么配置复杂,而富斯i6遥控器配合iA6B接收机恰好提供了一个低成本、高可靠性…...
Fish Speech 1.5在医疗健康领域的语音辅助应用
Fish Speech 1.5在医疗健康领域的语音辅助应用 1. 引言 在医疗健康领域,清晰准确的语音交流至关重要。医生需要向患者解释病情,护士要按时提醒用药,患者可能因为视力问题无法阅读病历资料。传统的文字信息在这些场景中往往显得不够直观和便…...
RWKV7-1.5B-g1a作品分享:多轮追问下保持主题聚焦的能力验证
RWKV7-1.5B-g1a作品分享:多轮追问下保持主题聚焦的能力验证 1. 模型简介与测试背景 rwkv7-1.5B-g1a是基于RWKV-7架构的多语言文本生成模型,特别适合基础问答、文案续写、简短总结和轻量中文对话场景。本次测试将重点验证该模型在多轮对话中保持主题聚焦…...
Windows远程桌面多用户协作解决方案:从原理到实践
Windows远程桌面多用户协作解决方案:从原理到实践 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 问题溯源:远程协作的瓶颈与突破 当团队成员需要同…...
Vue3 + Vite + SuperMap iClient3D 避坑指南:从零搭建三维GIS项目(附常见报错解决方案)
Vue3 Vite SuperMap iClient3D 三维GIS开发实战:从环境搭建到避坑指南 三维地理信息系统(3D GIS)开发正成为智慧城市、数字孪生等领域的核心技术栈。本文将带你从零开始,基于Vue3和Vite构建工具,整合SuperMap iClien…...
用Isaac Sim的Action Graph给ROS2机器人发布激光雷达数据:一个完整的传感器仿真流程
用Isaac Sim的Action Graph实现ROS2激光雷达数据仿真:从传感器配置到RViz可视化的全流程指南 在机器人开发和自动驾驶系统测试中,高保真的传感器仿真能够显著降低硬件成本和迭代周期。NVIDIA Isaac Sim作为一款强大的机器人仿真平台,与ROS2生…...
HDF5文件可视化指南:用HDFView检查你的Python数据存储结果
HDF5文件可视化指南:用HDFView检查你的Python数据存储结果 当你用Python处理完一批数据并存入HDF5文件后,最让人忐忑的莫过于——数据真的按预期存储了吗?结构是否正确?数值有无异常?本文将带你用HDFView这款专业工具&…...
