第八节:Activiti6.0——启动流程相关
时间:2022-07-25
本文章向大家介绍第八节:Activiti6.0——启动流程相关,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、概述
介绍:在启动流程后,每个流程实例都会有执行流(存储在act_ru_execution表中)。实例都有主执行流,没有父id的执行流是流程实例,其后如果流程中有一个分支则有一个子执行流,分支和子执行流一一对应。对执行流可以设置变量,设置子执行流的变量为本地(临时)变量(自在当前执行流有效),设置主执行流的变量为全局变量。
二、执行流查看
- 一个分支的流程测试。
- 流程图如下:
- 使用代码直接进行部署
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
//发布资源
Deployment deployment = repositoryService.createDeployment().addClasspathResource("single.bpmn").deploy();
//获取流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
//获取流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
//打印流程实例id,即主执行流。结果:97505
System.out.println(processInstance.getId());
//关闭
processEngine.close();
System.exit(0);
- 查看数据库(act_ru_execution)
- 多个分支的流程。
- 流程图如下:
- 部署和一个分支的一样
- 查看数据库
三、启动流程的"BUSINESS_KEY_"
概述:
- “BUSINESS_KEY_” 这个为业务主键,主流程才会使用业务主键,另外这个业务主键字段在表中有唯一约束,可以使用该值进行查询。业务主键在启动流程时可以设置值,使用startProcessInstanceById()方法的一个重载方法,存储在act_ru_execution的BUSINESS_KEY_字段。以下为测试。
- 上面测试方法的启动流程方式使用的是runtimeService.startProcessInstanceById()方法,另外runtimeService的startProcessInstanceByKey(String processDefinitionKey)也可以启动,其中此时的流程定义的key,对应的bpmn文件的process标签的id。
测试:
- 使用的bpmn和单分支的流程图一样 2.关键代码如下:
//获取流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
//获取流程实例,此处的第二个参数对应的是数据库act_ru_execution的BUSINESS_KEY_
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(), "abc");
- 查看数据库
四、执行流的本地(局部)变量和全局变量
概述: 对执行流可以设置本地变量和全局变量。本地变量会在当前执行流有效,如果当前执行流complete,则数据库中的本地变量会被删除,无法再使用。全局变量是与主执行流绑定的,在当前流程实例中会一直存在。测试如下:
- 流程图如下:
- 编码如下:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
TaskService taskService = processEngine.getTaskService();
Deployment deployment = repositoryService.createDeployment().addClasspathResource("scope.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
System.out.println("流程实例id:" processInstance.getId());
System.out.println("========================================================");
//查询任务,首次查询时两个任务是并行的,所有会有两个任务
List<Task> taskList = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
taskList.forEach(tempTask-> {
//首先查询执行流
Execution execution = runtimeService.createExecutionQuery().executionId(tempTask.getExecutionId()).singleResult();
if ("TaskA".equals(tempTask.getName())){
//给执行流A设置本地变量,即为在当前执行流执行.如果当前执行流complete,则该变量会被删除。绑定在执行流上的
runtimeService.setVariableLocal(execution.getId(),"taskVarA","varA");
System.out.println("给执行流TaskA设置本地变量 varA 完成");
}else {
//给执行流B设置全局变量,在当前实例都可以获取到,是直接绑定到流程实例上的
runtimeService.setVariable(execution.getId(),"taskVarB","varB");
runtimeService.setVariable(execution.getId(),"taskVarB2","varB2");
System.out.println("给执行流TaskB设置全局变量 varB和varB2 完成");
}
});
//临时暂停30s,查看数据库变化
Thread.sleep(30000);
//将TaskA和TaskB完成,到达TaskC可以进行参数查询
taskList.forEach(task -> taskService.complete(task.getId()));
System.out.println("========================================================");
//进行参数查询
Task taskC = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
System.out.println("当前任务:" taskC.getName() ". 获取执行流参数如下:");
System.out.println(runtimeService.getVariable(taskC.getExecutionId(), "taskVarA"));
System.out.println(runtimeService.getVariable(taskC.getExecutionId(), "taskVarB"));
processEngine.close();
System.exit(0);
- 查看数据库
- TaskA和TaskB在complete之前 执行流如下:
变量如下(act_ru_variable表),其中全局变量是绑定的EXECUTION_ID_是主执行流:
- complete之后 执行流如下,此处的TaskA和TaskB执行已经没了,可以看ACT_ID_不同:
变量,可以看到本地变量被删除了,只有全局变量被保存下来:
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(67)-MVC与ECharts
- 2018年机器学习和数据科学重要会议概览
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(60)-系统总结
- WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构
- 使用动态语言来制作silverlight
- 《资讯》霍金:人工智能的威胁就像核武器,世界将发生10大变化!
- [原创]WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿
- 厉害了,连美图CEO都开始热捧区块链了!
- Silverlight制作逐帧动画
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(58)-DAL层重构
- 糟糕了!这次新版微信,要干死所有小游戏了!
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(59)-BLL层重构
- 除了奇奇怪怪的机器人们,2017年人工智能还干了哪些“蠢事”?
- 区块链搬砖的坑及有效鉴别方法
- 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 数组属性和方法