Activiti流程变量使用
程序员文章站
2024-03-26 08:57:23
...
本文是建立在流程定义,流程实例的基础上的,可以参阅流程定义,流程实例。 本文主要给出了如何使用流程变量的demo,包含流程变量的设置、获取方法,设置实例级别、任务级别的流程变量的方法,主要的描述请查看代码以及代码上的注释。
import com.google.gson.Gson;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ActivitiApplication.class)
public class ProcessVariablesTest {
private Gson gson = new Gson();
@Autowired
private ProcessEngine processEngine;
/**
* 设置流程变量
* 1.流程变量的作用域就是流程实例,所以只要设置就行了,不用管在哪个阶段设置
* 2.基本类型设置流程变量,在taskService中使用任务ID,定义流程变量的名称,设置流程变量的值。
* 3.Javabean类型设置流程变量,需要这个javabean实现了Serializable接口
* 4.涉及到的表
* ACT_HI_VARINST 流程变量历史表
* ACT_RU_VARIABLE 正在执行的流程变量表
* 5.RuntimeService对象可以设置流程变量和获取流程变量
* 6.TaskService对象可以设置流程变量和获取流程变量
* 7.流程实例启动的时候可以设置流程变量
* 8.任务办理完成的时候可以设置流程变量
* 9.流程变量可以通过名称/值的形式设置单个流程变量
* 10.流程变量可以通过Map集合,同时设置多个流程变量
* 11.Map集合的key表示流程变量的名称, Map集合的value表示流程变量的值
* 12.setVariable和setVariableLocal的区别
* setVariable:设置流程变量的时候,流程变量名称相同的时候,后一次的值替换前一次的值,
* 而且可以看到TASK_ID的字段不会存放任务ID的值。
* setVariableLocal:
* 1:设置流程变量的时候,针对当前活动的节点设置流程变量,如果一个流程中存在2个活动节点,
* 对每个活动节点都设置流程变量,即使流程变量的名称相同,后一次的版本的值也不会替换
* 前一次版本的值,它会使用不同的任务ID作为标识,存放2个流程变量值,而且可以看到
* TASK_ID的字段会存放任务ID的值,例如act_hi_varinst 表的数据:不同的任务节点,即使流程变量名称相同,
* 存放的值也是不同的。
* 2:使用setVariableLocal说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取
* 不到这个流程变量(因为正在执行的流程变量中没有这个数据),所有查询正在执行的任务时
* 不能查询到需要的数据,此时需要查询历史的流程变量。
*/
@Test
public void setVariablesTest() {
TaskService taskService = processEngine.getTaskService();
String instanceId = "17501";
Task task = taskService.createTaskQuery()
.processInstanceId(instanceId)
.singleResult();
taskService.setVariable(task.getId(), "姓名", "张三");
taskService.setVariable(task.getId(), "性别", "李四");
Map<String, Object> variables = new HashMap<>();
variables.put("key", "value");
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance pi = runtimeService.startProcessInstanceById("helloworld:5:32504", variables);
runtimeService.setVariable(pi.getProcessInstanceId(), "key1", "value1");
runtimeService.setVariables(pi.getProcessInstanceId(), variables);
List<String> keys = new ArrayList<>();
keys.add("key");
Map map = runtimeService.getVariables(pi.getProcessInstanceId());
System.out.println(gson.toJson(map));
}
/**
* 获取流程变量
* 1.流程变量的获取针对流程实例(即1个流程),每个流程实例获取的流程变量时不同的
* 2.使用基本类型获取流程变量,在taskService中使用任务ID,流程变量的名称,获取流程变量的值。
* 3.Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,
* 否则抛出异常。解决方案,固定序列化ID
*/
@Test
public void getVariablesTest() {
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
.processInstanceId("17501")
.singleResult();
String name = (String) taskService.getVariable(task.getId(), "姓名");
String gender = (String) taskService.getVariable(task.getId(), "性别");
System.out.println("姓名:" + name + "\t 性别:" + gender);
}
/**
* 查询历史的流程变量
*/
@Test
public void getHisVariablesTest() {
List<HistoricVariableInstance> instances = processEngine.getHistoryService()
.createHistoricVariableInstanceQuery().variableName("姓名").list();
instances.forEach(instance -> {
System.out.println(instance.getVariableName() + "\t" + instance.getValue());
});
}
}
上一篇: 当代人工智能与中医
下一篇: 客户端webSocket的一些基本用法
推荐阅读
-
Activiti流程变量使用
-
JBPM4.4 使用之流程管理初探
-
maven的安装、配置环境变量以及使用
-
TensorFlow Lite 开发手册(6)——TensorFlow Lite模型使用通用流程(以CPM算法为例)
-
makefile文件创建和使用变量(类似于c语言中的宏定义)
-
基于 Spring Boot 2.x 使用 Activiti 创建一个简易的请假流程
-
【Activiti工作流】5. 简单请假流程
-
【Activity学习五】--基于SSM整合Activiti之请假流程实现(二)
-
min函数和与函数名相同的变量—在c++与matlab中的使用
-
用 Postman 做接口自动化(十一)变量使用