第七节:Activiti6.0——Task的变量使用
时间:2022-07-25
本文章向大家介绍第七节:Activiti6.0——Task的变量使用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、概述
介绍: 在任务的执行过程中,会有很多的变量参数(比如请假任务需要天数等)。变量从作用域来分:本地变量和全局变量。 从类型区分:基本变量、自定义变量和BPMN自带变量。
二、基本变量和自定义变量
- 基本变量是activiti自带的类型,只需要调用taskService的setVariable方法设置就行。
- 编码如下:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
//直接new一个任务,不是生产上的方式,此处只为演示
String taskId = UUID.randomUUID().toString();
Task task = taskService.newTask(taskId);
task.setName("基本变量测试任务");
taskService.saveTask(task);
//给指定任务设置任务变量。此处变量类型为String
taskService.setVariable(taskId,"variable1", "hello");
//查询任务变量
Object variable1 = taskService.getVariable(taskId, "variable1");
System.out.println(variable1);
//关闭
processEngine.close();
System.exit(0);
- 查询任务对应的数据库:
- 查看任务变量:
- 自定义变量:是将对象进行序列化存储到act_ge_bytearray中,然后在变量表act_ru_variable中引用
- 定义实体Person:
private String id;
private String username;
private String password;
- 变量设置编码:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.newTask("1");
task.setName("自定义变量测试任务");
taskService.saveTask(task);
//给任务设置自定义变量,变量是序列化后保存的
Person person = new Person();
person.setId("1");
person.setUsername("xjf");
person.setPassword("123456");
taskService.setVariable(task.getId(),"person1",person);
//查询任务变量
Person person1 = taskService.getVariable(task.getId(), "person1", Person.class);
System.out.println("查询到的变量:" person1);
processEngine.close();
System.exit(0);
- 查看数据库变量:
- 真正存储的act_ge_bytearray:
三、本地变量和全局变量
介绍: 本地变量是指在一个任务节点的变量,该变量只在当前节点有效,当该节点complete后会实效(在数据库中被删除)。全局变量是对该流程实例一直有效,可以随时获取。测试如下:
- 设计流程如下图:
- 编码如下:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
TaskService taskService = processEngine.getTaskService();
//发布
Deployment deployment = repositoryService.createDeployment().addClasspathResource("variable.bpmn").deploy();
//获取流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
//创建流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
System.out.println("当前任务:" task.getName());
//设置任务本地变量:该变量只在当前任务节点有效
taskService.setVariableLocal(task.getId(),"date","2019-11-20");
//获取本地变量
System.out.println("当前任务本地变量:" taskService.getVariableLocal(task.getId(), "date"));
//设置全局变量
taskService.setVariable(task.getId(),"days","9");
//可以查看数据库,本地变量存在,complete之后再查看会没有了
Thread.sleep(10000);
//当前任务结束
taskService.complete(task.getId());
System.out.println("============================分隔符===========================");
//继续获取下个任务
task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
System.out.println("当前任务:" task.getName());
System.out.println("再次获取上个任务的本地变量:" taskService.getVariableLocal(task.getId(), "date"));
System.out.println("获取全局变量:" taskService.getVariable(task.getId(),"days"));
System.out.println("getVariableLocal方法获取全局变量:" taskService.getVariableLocal(task.getId(),"days"));
processEngine.close();
System.exit(0);
- 查看结果:
四、BPMN文件变量
**介绍:**在bpmn文件中,我们可以根据bpmn规范直接加入变量,在使用时可以直接使用代码获取。由此可以减少代码变量跟流程的耦合。测试如下:
- 设计bpmn文件(跟上面的bpmn文件一致,只是加了变量如下):
<process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
<!--此处为变量对象-->
<dataObject id="personName" name="personName"
itemSubjectRef="xsd:string">
<extensionElements>
<activiti:value>dale</activiti:value>
</extensionElements>
</dataObject>
<startEvent id="_2" name="StartEvent"/>
<userTask activiti:exclusive="true" id="_3" name="请假填写"/>
<userTask activiti:exclusive="true" id="_4" name="经理审批"/>
<endEvent id="_5" name="EndEvent"/>
<sequenceFlow id="_6" sourceRef="_2" targetRef="_3"/>
<sequenceFlow id="_7" sourceRef="_3" targetRef="_4"/>
<sequenceFlow id="_8" sourceRef="_4" targetRef="_5"/>
</process>
- 使用代码获取变量
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
TaskService taskService = processEngine.getTaskService();
Deployment deployment = repositoryService.createDeployment().addClasspathResource("dataobject.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
System.out.println(processDefinition.getId());
//获取流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
//获取任务
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
//获取bpmn中带的变量
System.out.println("变量:" taskService.getVariable(task.getId(), "personName"));
processEngine.close();
System.exit(0);
- 结果:
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 看完这篇并发后,又能扯皮了?
- Twitter美国航空公司情绪数据集的监督或半监督ULMFit模型
- 一文帮你理解整个 SRE 运维体系!
- 拆解式解读如何用飞桨复现胶囊神经网络(Capsule Network)
- 我用飞桨Parakeet合成小姐姐声音帮我“读”论文
- 【5分钟玩转Lighthouse】搭建WordPress博客
- vue接入腾讯地图(一)【点击事件】
- Redis文件事件&时间事件处理机制
- Redis持久化策略
- Redis二进制安全的原理
- 面试必备 Vue 知识点
- 数据传输 | mysqldiff/mysqldbcompare 实现 DTLE 自动化测试
- CPU有个禁区,内核权限也无法进入!
- 分布式 | DBLE 3.20.07.0 来啦!
- C语言三剑客之《C陷阱与缺陷》一书精华提炼