当前位置: 首页 > news >正文

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

一.简介

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

二.流程变量的分类

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

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

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

三.全局流程变量

按照上面请假流程,我们一起来看下流程变量的设置和获取。

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,然后设置流程变量,上面这段代码演示了两种设置方式:

  1. 逐个设置
  2. 直接设置一个 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);
}
http://www.lryc.cn/news/67520.html

相关文章:

  • 机器学习13(正则化)
  • 并发编程学习(十一):原子数组、
  • 递归到动态规划:省去枚举行为
  • 服务(第二十一篇)mysql高级查询语句(二)
  • MYSQL高可用配置(MHA)
  • 单精度浮点数与十进制数据相互转换
  • PMP敏捷-4大价值观、12原则
  • K8S—Helm
  • ALSA内部函数调用流程
  • Python正则表达式详解,保姆式教学,0基础也能掌握正则
  • ChatGPT 接入飞书教程,创建自己的聊天机器人
  • JS生成随机数(多种解决方案)
  • 文件IO 函数 静态库和动态库的创建 5.11
  • 考研日语-详解ている、てある、ていく、てくる用法
  • Spring Security 6.x 系列【36】授权服务器篇之OpenID Connect 1.0
  • 【计算机视觉 | Pytorch】timm 包的具体介绍和图像分类案例(含源代码)
  • 轻博客Plume的搭建
  • 机器人关节电机PWM
  • MPU6050详解(含源码)
  • Vue入门学习笔记:TodoList(三):实例中的数据、事件和方法
  • 怎么找到引发回流的JavaScript代码?
  • 未来广告策划,转型还是淘汰?
  • 【vscode远程开发】使用SSH远程连接服务器 「内网穿透」
  • 七天从零实现Web框架Gee - 扩展
  • 什么是土壤水分传感器
  • 月薪17k需要什么水平?98年测试员的面试全过程…
  • 知了汇智:坚持发展产教融合,做好高校、人才与企业之间的桥梁
  • MyBatis缓存-一级缓存--二级缓存的非常详细的介绍
  • macOS Ventura 13.4 RC2(22F63)发布
  • 【为什么可以相信一个HTTPS网站】