Springboot +Flowable,设置流程变量的方式(二)

news/2025/1/25 8:24:57/

一.简介

为什么需要流程变量。
举个例子,假设有如下一个流程,截图如下:
在这里插入图片描述
这是一个请假流程,那么谁请假、请几天、起始时间、请假理由等等,这些都需要说明,不然领导审批的依据是啥?那么如何传递这些数据,我们就需要流程变量。

二.流程变量的分类

目前流程变量可以分为三种类型:

  1. 全局流程变量:在整个流程执行期间,这个流程变量都是有效的。
  2. 本地流程变量:这个只针对流程中某一个具体的 Task(任务)有效,这个任务执行完毕后,这个流程变量就失效了。
  3. 临时流程变量:顾名思义就是临时的,这个不会存入到数据库中。

在接下来学习这些流程变量的用法。

三.本地流程变量

上一篇文章说的全局流程变量是和某一个具体的流程绑定的,而本地流程变量则不同,本地流程变量和某一个 Task 绑定。

1.通过 Task 设置

假设启动流程之后,通过 Task 来设置一个本地流程变量,代码如下:

@Test
void test03() {Task task = taskService.createTaskQuery().singleResult();taskService.setVariableLocal(task.getId(), "days", 10);Map<String, Object> variables = new HashMap<>();variables.put("reason", "休息一下");variables.put("startTime", new Date());taskService.setVariables(task.getId(),variables);
}

上面这段代码中,设置了一个本地变量,两个全局变量,设置完成后,去 ACT_RU_VARIABLE 表中来查看一下具体的效果,截图如下:
在这里插入图片描述
可以看到,由于 days 是本地变量,所以它的 TASK_ID_ 有值,这个好理解,说明 days 这个变量和这个具体的 Task 是有关的。
此时如果完成这个 Task,代码如下:

@Test
void test06() {Task task = taskService.createTaskQuery().singleResult();taskService.complete(task.getId());
}

完成之后,再来查看 ACT_RU_VARIABLE 表,截图如下:
在这里插入图片描述
可以看到本地变量 days 已经没有了。因为上一个 Task 都已经执行完毕了,这个时候如果还是按照上一篇第三小节介绍的方式去查询变量,就查不到 days 了。此时如果需要查询到曾经的 days 变量,得去历史表中查询了,代码如下:

@Test
void test07() {ProcessInstance pi = runtimeService.createProcessInstanceQuery().singleResult();List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().processInstanceId(pi.getId()).list();for (HistoricVariableInstance hvi : list) {logger.info("name:{},type:{},value:{}", hvi.getVariableName(), hvi.getVariableTypeName(), hvi.getValue());}
}

这是流程本地变量的特点,当然相关的方法还有好几个,代码如下:

org.flowable.engine.TaskService#complete(java.lang.String, java.util.Map<java.lang.String,java.lang.Object>, boolean):在完成一个 Task 的时候,如果传递了变量,则可以通过第三个参数来控制这个变量是全局的还是本地的,true 表示这个变量是本地的。org.flowable.engine.RuntimeService#setVariableLocal:为某一个执行实例设置本地变量。org.flowable.engine.RuntimeService#setVariablesLocal:同上,批量设置。

四.临时流程变量

临时流程变量是不存数据库的,一般来说可以在启动流程或者完成任务的时候使用,代码如下:

@Test
void test21() {Map<String, Object> variables = new HashMap<>();variables.put("reason", "休息一下");variables.put("startTime", new Date());ProcessInstance pi = runtimeService.createProcessInstanceBuilder().transientVariable("days", 10).transientVariables(variables).processDefinitionKey("demo01").start();logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}

上面这段代码涉及到的流程变量就是临时流程变量,它是不会存入到数据库中的。
也可以在完成一个任务的时候设置临时变量,代码如下:

@Test
void test22() {Task task = taskService.createTaskQuery().singleResult();Map<String, Object> transientVariables = new HashMap<>();transientVariables.put("days", 10);taskService.complete(task.getId(), null, transientVariables);
}

这个临时变量也是不会存入到数据库中的。


http://www.ppmy.cn/news/67129.html

相关文章

开源项目九死一生,但很多程序员坚持开源??

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们讨论一个开放问题。 为什么流行的开源项目只是凤毛麟角&#xff0c;且很多有名的开源项目都是背靠大公司的。 但是&#xff0c;为什么还有很多个人开发者愿意开源项目呢&#xff1f; 欢迎大家把自己的想法或开源项目发…

大语言模型Prompt工程之使用GPT3.5生成图数据库Cypher

大语言模型Prompt工程之使用GPT3.5生成图数据库Cypher 大语言模型Prompt工程之使用GPT3.5生成图数据库Cypher Here’s the table of contents: 大语言模型Prompt工程之使用GPT3.5生成图数据库Cypher 使用GPT3.5测试了生成Cypher的能力&#xff0c;相比于GPT4生成Cypher的能力&a…

电脑死机的常用排查思路

在工作过程中难免会遇到死机的问题&#xff0c;排查起来并不是那么轻松&#xff0c;下面分享一下我排查死机问题的思路。 判断是软件还是硬件级别的故障 在死机时先尝试移动鼠标&#xff0c;按大小写切换键或数字键盘锁定键&#xff0c;看看光标是否可以移动&#xff0c;大小…

【地铁上的设计模式】--行为型模式:备忘录模式

什么是备忘录模式 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;其目的是在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存该状态&#xff0c;以便之后恢复对象到该状态。该模式可以使得对象的…

大数据Doris(十六):分桶Bucket和分区、分桶数量和数据量的建议

文章目录 分桶Bucket和分区、分桶数量和数据量的建议 一、分桶Bucket

MagicalCoder系列教程(二):如何下载本地安装启动项目?

目录 下载启动 1 windows下载 2 linux下载 3 安装启动方式&#xff1a; 3.1 Windows免安装 3.2 其他操作系统&#xff08;Mac等其他操作系统&#xff09; 3.3 启动安装失败 MagicalCoder可视化开发平台&#xff1a;轻松搭建业务系统&#xff0c;为企业创造更多价值&…

元宇宙医疗虚拟人的功能,创造哪些新体验

虚拟数字人的出现对于精准医疗及人类健康的发展将带来不可估量的作用。通过三维可视化、3D打印、大数据及人工智能等多种数字化手段&#xff0c;在医学研究方面取得新的进展。 居家/健康&#xff1a;智能虚拟管家、家庭虚拟医生、家庭虚拟陪护员 一、虚拟数字人的医学知识普及优…

playwright基础教程

文章目录 playwright介绍基础用法在输入框中输入文本点击页面元素选择下拉列表中的选项模拟键盘输入模拟鼠标操作使用Playwright进行页面交互 实战示列1、打开浏览器2、搜索关键词3、截屏4、 多页面跳转4、文件上传5、模拟移动设备6、自动化截图7、使用Playwright进行表单填写和…