2023最新版本Activiti7系列-流程变量

news2024/11/7 7:50:54

流程变量

在这里插入图片描述

  流程变量可以用将数据添加到流程的运行时状态中,或者更具体地说,变量作用域中。改变实体的各种API可以用来更新这些附加的变量。一般来说,一个变量由一个名称和一个值组成。名称用于在整个流程中识别变量。例如,如果一个活动(activity)设置了一个名为 var 的变量,那么后续活动中可以通过使用这个名称来访问它。变量的值是一个 Java 对象。

1.运行时变量

  流程实例运行时的变量,存入act_ru_variable表中。在流程实例运行结束时,此实例的变量在表中删除。在流程实例创建及启动时,可设置流程变量。所有的startProcessInstanceXXX方法都有一个可选参数用于设置变量。例如,RuntimeService

ProcessInstance startProcessInstanceById(String processDefinitionId, Map<String, Object> variables);

  也可以在流程执行中加入变量。例如,(RuntimeService):

    void setVariable(String executionId, String variableName, Object value);
    void setVariableLocal(String executionId, String variableName, Object value);
    void setVariables(String executionId, Map<String, ? extends Object> variables);
    void setVariablesLocal(String executionId, Map<String, ? extends Object> variables);

  读取变量方法:

    Map<String, Object> getVariables(String executionId);
    Map<String, Object> getVariablesLocal(String executionId);
    Map<String, Object> getVariables(String executionId, Collection<String> variableNames);
    Map<String, Object> getVariablesLocal(String executionId, Collection<String> variableNames);
    Object getVariable(String executionId, String variableName);
    <T> T getVariable(String executionId, String variableName, Class<T> variableClass);

注意:由于流程实例结束时,对应在运行时表的数据跟着被删除。所以查询一个已经完结流程实例的变量,只能在历史变量表中查找。

  当然运行时变量我们也可以根据对应的作用域把他分为全局变量局部变量.

1.1 全局变量

  流程变量的默认作用域是流程实例。当一个流程变量的作用域为流程实例时,可以称为 global 变量

注意:如: Global变量:userId(变量名)、zhangsan(变量值)

  global 变量中变量名不允许重复,设置相同名称的变量,后设置的值会覆盖前设置的变量值。

案例:

定义监听器

public class MySecondListener implements TaskListener {

    @Override
    public void notify(DelegateTask delegateTask) {
        // 获取所有的流程变量
        Map<String, Object> variables = delegateTask.getVariables();
        Set<String> keys = variables.keySet();
        for (String key : keys) {
            Object obj = variables.get(key);
            System.out.println(key + " = " + obj);
            if(obj instanceof  String){
              // 修改 流程变量的信息
              // variables.put(key,obj + ":boge3306"); 直接修改Map中的数据 达不到修改流程变量的效果
              delegateTask.setVariable(key + ":boge3306");
            }
        }
    }
}

设计流程
在这里插入图片描述

然后完成流程的部署操作

@Test
public void test1(){
    // 1.获取ProcessEngine对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 2.完成流程的部署操作 需要通过RepositoryService来完成
    RepositoryService repositoryService = processEngine.getRepositoryService();
    // 3.完成部署操作
    Deployment deploy = repositoryService.createDeployment()
            .addClasspathResource("flow/holiday1.bpmn20.xml")
            .name("请假流程-流程变量")
            .deploy(); // 是一个流程部署的行为 可以部署多个流程定义的
    System.out.println(deploy.getId());
    System.out.println(deploy.getName());
}

然后启动流程实例。注意在启动流程实例时我们需要指定相关的流程变量

/**
 * 发起一个流程
 */
@Test
public void test3(){
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    // 发起流程 需要通过 runtimeService来实现
    RuntimeService runtimeService = engine.getRuntimeService();
    // 定义流程变量信息
    Map<String,Object> map = new HashMap<>();
    map.put("assignee1","张三");
    map.put("assignee2","李四");
    map.put("ass1","变量1");
    map.put("ass2",299);
    map.put("ass3","湖南长沙");
    map.put("ass4","波哥666");
    // 通过流程定义ID来启动流程  返回的是流程实例对象
    ProcessInstance processInstance = runtimeService
            .startProcessInstanceById("holiday1:1:42503",map);
    System.out.println("processInstance.getId() = " + processInstance.getId());
    System.out.println("processInstance.getDeploymentId() = " + processInstance.getDeploymentId());
    System.out.println("processInstance.getDescription() = " + processInstance.getDescription());
}

启动流程和触发对应的监听器,同时会在act_ru_variable中记录当前的变量信息

在这里插入图片描述

当然我们也可以通过RunTimeService来查询当前对应的流程实例的流程变量信息

/**
 * 查询当前的流程变量信息
 */
@Test
public void testVal(){
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    RuntimeService runtimeService = engine.getRuntimeService();
    // 获取流程变量信息  获取某个流程实例的变量信息
    Map<String, VariableInstance> variableInstances =
            runtimeService.getVariableInstances("50008");
    Set<String> keys = variableInstances.keySet();
    for (String key : keys) {
        System.out.println(key+"="+variableInstances.get(key));
    }
}

1.2 局部变量

  任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大, 称为 local 变量。

  Local 变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名可以相同没有影响。Local 变量名也可以和 global 变量名相同,没有影响。

我们通过RuntimeService 设置的Local变量绑定的是 executionId。在该流程中有效

    @Test
    public void test4(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        // 待办查询 执行中的任务处理通过 TaskService来实现
        TaskService taskService = engine.getTaskService();
        RuntimeService runtimeService = engine.getRuntimeService();
        runtimeService.setVariableLocal("60004","orderId","100001");
        runtimeService.setVariableLocal("60004","price",6666);
    }

我们还可以通过TaskService来绑定本地流程变量。需要指定对应的taskId

@Test
public void test41(){
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    // 待办查询 执行中的任务处理通过 TaskService来实现
    TaskService taskService = engine.getTaskService();
    taskService.setVariableLocal("60007","wechat","boge3306");
}

然后通过测试演示我们可以看到通过TaskService绑定的Local变量的作用域只是在当前的Task有效。而通过RuntimeService绑定的Local变量作用的访问是executionId。

需要注意:executionId和processInstanceId的区别

2.历史变量

  历史变量,存入act_hi_varinst表中。在流程启动时,流程变量会同时存入历史变量表中;在流程结束时,历史表中的变量仍然存在。可理解为“永久代”的流程变量。

  获取已完成的、id为’XXX’的流程实例中,所有的HistoricVariableInstances(历史变量实例),并以变量名排序。

historyService.createHistoricVariableInstanceQuery()
    .processInstanceId("XXX")
    .orderByVariableName.desc()
    .list();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/624851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Android 上恢复已删除的通话记录 - 安卓手机通话记录恢复技巧

有时&#xff0c;Android 用户会在内存空间用完时删除他们的通话记录。他们认为那些电话通话记录将不再需要了&#xff0c;但突然出于某些原因他们需要恢复那些已删除的通话记录。 恢复已删除的照片、视频、音乐、短信和通话记录等数据在以前是一件很难的事情。但是现在如果你…

# 蓝牙音频相关知识

蓝牙音频相关知识 文章目录 蓝牙音频相关知识1 音频源2 蓝牙音频编解码器3 一些标准4 蓝牙音频其他相关知识4.1 蓝牙版本4.2 ANC&#xff08;主动降噪&#xff09;4.3 音响相关参数4.4 音质评价4.5 HI-Fi声音特点4.6 耳机线材4.7 耳机分类4.8 IP防尘防水等级4.9 噪音与量化噪音…

如何用Python语言调取百度翻译的API

诸神缄默不语-个人CSDN博文目录 本文介绍如何用Python语言调用百度翻译的API服务。 理论上类似的写法也可以应用于其他语言。 http://api.fanyi.baidu.com/manage/developer可以注册开发者&#xff0c;或者APP ID和秘钥&#xff1b;然后还可以进行开发者认证&#xff0c;获得…

ajax-1--XML、AJAX简介、express框架使用、AJAX操作的基本步骤

一、XML&#xff08;可扩展标记语言&#xff09; XML与HTML类似&#xff0c;不同的是HTML中都是预定义标签&#xff0c;而XML中没有预定义标签&#xff0c;全都是自定义标签&#xff0c;用来表示一些数据。 比如有一个学生数据&#xff1a;name“孙悟空”;age18;gender“男”&a…

【Python实战】Python采集大学教务系统成绩单

前言 在现代教育中&#xff0c;教务系统已经成为了学校管理和教学工作的重要组成部分。然而&#xff0c;由于各种原因&#xff0c;教务系统的成绩单并不能下载的&#xff0c;这给我们带来了很多不必要的麻烦和困扰。因此&#xff0c;采集教务系统成绩单的项目具有非常重要的意义…

【轻量化网络系列(6)】EfficientNetV1论文超详细解读(翻译 +学习笔记+代码实现)

前言 EfficientNetV1是Google在2019年发布的文章&#xff0c;这篇论文最主要的创新点是Model Scaling。论文提出了compound scaling&#xff0c;混合缩放&#xff0c;把网络缩放的三种方式&#xff1a;深度、宽度、分辨率&#xff0c;组合起来按照一定规则缩放&#xff0c;从…

使用FPGA驱动GS2972(3G-SDI模式)外同步(HSYNC VSYNC DE)或内(BT1120)同步输出彩条调试

GS2972视频输出调试 一、外同步模式1.1 GS2972的硬件初始化1.2 GS2972的驱动时序1.3 GS2972的驱动RTL代码1.4 GS2972输出彩条1.5 GS2972驱动易出bug二、数据内嵌同步模式2.1 GS2972的硬件初始化2.2 GS2972的驱动时序2.3 GS2972的驱动RTL代码2.4 GS2972输出彩条2.5 GS2972驱动易…

IIC总线简介及IIC的通信过程与时序

1.IIC总线简介 IIC总线&#xff1a; IIC总线是Philips公司在八十年代初推出的一种串行、半双工总线&#xff0c;主要用于近距离、低速的芯片之间的通信&#xff1b;IIC总线有两根双向的信号线&#xff0c;一根数据线SDA用于收发数据&#xff0c;一根时钟线SCL用于通信双方时钟…

跳槽一次涨8k,5年跳了3次...

最近有人说&#xff0c;现在软件测试岗位初始工资太低了&#xff0c;有些刚刚入行的测试朋友说自己工资连5位数都没有…干了好几年也没怎么涨。 看看别人动辄月薪1-2万&#xff0c;其实我想说也没那么难。 说下如何高效地拿到3万的工资&#xff0c;总体来说&#xff0c;就靠跳…

墨天轮关系型分布式数据库榜单解读

分布式关系型数据库概述 作为数据库演进方向之一&#xff0c;分布式能力受到更多用户的关注。从技术架构演进来看&#xff0c;数据库正走过了从单机式、集中式到分布式的发展过程&#xff0c;目前是多种架构并存的阶段。分布式架构以其更好的存储与计算扩展能力&#xff0c;受…

四六位、不定长、计算题等验证码,一款工具全部搞定,简单方便还开箱即用,精度高达96%!!

四六位、不定长、计算题等验证码,第三方平台准确率低,自己不会神经网络训练,嫌麻烦,一款工具全部搞定,开箱即用!! 本文秉承着开箱即用的原则,真正做到一款工具识别秒杀所有单行文本验证码,这里的单行指的就是某张4位6位或者计算题或者文字的验证码,我是使用了4位+6位…

Vue2数据代理的理解

理解 最近在复习Vue2&#xff0c;对于数据代理有些模糊。查阅了一些资料。 这是官方解释https://v2.cn.vuejs.org/v2/api/#data数据代理&#xff1a;通过代理对象 操作&#xff08;读/写&#xff09;目标对象中的属性 这里出现了两个对象&#xff0c;一个叫代理对象&#xf…

VMware虚拟机安装Windows Server 2003

哈喽&#xff0c;各位小伙伴大家好&#xff0c;win server2003算是拖了比较久了&#xff0c;一直没发布&#xff0c;今天完成server2003的安装后server系列的安装教程就告一段落了。马上暑假了&#xff0c;想必新生开学之后&#xff0c;很多计算机网络专业的同学们要开始接触到…

全志V3S嵌入式驱动开发(sd卡驱动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前开发过程中&#xff0c;整个linux的启动都是基于sd卡进行的。此外&#xff0c;我们有这么几点发现&#xff0c;首先&#xff0c;v3s本身是识别…

Python3+Selenium2完整的自动化测试实现之旅(五):自动化测试框架、Python面向对象以及POM设计模型简介

目录 前言 1 自动化测试框架概述 2 自动化测试框架需要的环境 3 自动化测试框架设计思想&#xff1a;Python面向对象 4 自动化测试框架设计思想&#xff1a;POM&#xff08;Page Object Model&#xff09;页面对象模型 【自动化测试工程师学习路线】 结语 前言 之前…

【AI数学】相机成像之外参数

在一个多视点计算机视觉系统里&#xff0c;系统输入除了多个视角的图像外&#xff0c;一般还需要输入对应视角下相机的内外参数。其中&#xff0c;相机内参数决定了图像坐标系和相机三维坐标系的映射关系&#xff0c;而相机外参数则决定了相机三维坐标系和世界坐标系的对应关系…

【TCP/IP】多进程服务器的实现(进阶) - 进程的概念及fork函数

目录 进程的概念及应用 进程的定义 进程的ID fork函数&#xff08;进程创建函数&#xff09; 多进程&#xff08;以及多线程&#xff09;是现代计算机网络的精髓。在之前&#xff0c;我们所做的诸如回声服务器、回声客户端、文件收发等都是偏向基础的单进程应用。而经过前面…

【论文阅读】Twin neural network regression is a semi- supervised regression algorithm

论文下载 GitHub bib: ARTICLE{,title {Twin neural network regression is a semi- supervised regression algorithm},author {Sebastian J Wetzel and Roger G Melko and Isaac Tamblyn},journal {Machine Learning: Science and Technology},year {2022},volum…

“我转行做测试开发的这一年多,月薪5K变成了18K”,中文系萌妹的自白

公司老板是我的测试引路人 本人就读于某普通院校&#xff0c;在大学期间就开始实习找工作&#xff0c;误打误撞进入一家做工业大数据的创业公司。 刚开始我并没有明确的职业发展方向&#xff0c;主要是做一些环境搭建的基础工作。但由于执行效率高&#xff0c;工作责任感强&a…

06-发送短信验证码实现登录功能

1、发送短信验证码实现登录功能的流程 1.1、获取验证码流程 1.2、登录流程 1.3、页面带有图形验证码的流程 2、 注册登录二合一页面的开发 2.1、将src目录下的App.vue页面上通用显示的删掉 2.2、在router目录下的index.js文件中通过懒加载的方式添加login.vue页面 对于rout…