专栏首页指缝阳光第八节:Activiti6.0——启动流程相关

第八节:Activiti6.0——启动流程相关

一、概述

介绍:在启动流程后,每个流程实例都会有执行流(存储在act_ru_execution表中)。实例都有主执行流,没有父id的执行流是流程实例,其后如果流程中有一个分支则有一个子执行流,分支和子执行流一一对应。对执行流可以设置变量,设置子执行流的变量为本地(临时)变量(自在当前执行流有效),设置主执行流的变量为全局变量。

二、执行流查看

  1. 一个分支的流程测试。
  • 流程图如下:
  • 使用代码直接进行部署
	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)
  1. 多个分支的流程。
  • 流程图如下:
  • 部署和一个分支的一样
  • 查看数据库

三、启动流程的"BUSINESS_KEY_"

概述

  • “BUSINESS_KEY_” 这个为业务主键,主流程才会使用业务主键,另外这个业务主键字段在表中有唯一约束,可以使用该值进行查询。业务主键在启动流程时可以设置值,使用startProcessInstanceById()方法的一个重载方法,存储在act_ru_execution的BUSINESS_KEY_字段。以下为测试。
  • 上面测试方法的启动流程方式使用的是runtimeService.startProcessInstanceById()方法,另外runtimeService的startProcessInstanceByKey(String processDefinitionKey)也可以启动,其中此时的流程定义的key,对应的bpmn文件的process标签的id。

测试:

  1. 使用的bpmn和单分支的流程图一样 2.关键代码如下:
	//获取流程定义
	ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();

	//获取流程实例,此处的第二个参数对应的是数据库act_ru_execution的BUSINESS_KEY_
	ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(), "abc");
  1. 查看数据库

四、执行流的本地(局部)变量和全局变量

概述: 对执行流可以设置本地变量和全局变量。本地变量会在当前执行流有效,如果当前执行流complete,则数据库中的本地变量会被删除,无法再使用。全局变量是与主执行流绑定的,在当前流程实例中会一直存在。测试如下:

  1. 流程图如下:
  1. 编码如下:
	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);
  1. 查看数据库
  • TaskA和TaskB在complete之前 执行流如下:

变量如下(act_ru_variable表),其中全局变量是绑定的EXECUTION_ID_是主执行流:

  • complete之后 执行流如下,此处的TaskA和TaskB执行已经没了,可以看ACT_ID_不同:

变量,可以看到本地变量被删除了,只有全局变量被保存下来:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 第五节:Activiti6.0——流程定义相关API

    介绍:在发布一次资源后,会生成对应的流程定义(存储在表act_re_procdef)中,该定义记录一个流程的信息,如下图所有:

    凡人飞
  • Activiti6.0——个人开发经验总结

    我的一个集成项目:springboot集成activiti6.0 https://github.com/fanrendale/springboot-activ...

    凡人飞
  • 【程序源代码】spring整合activiti流程设计器

    关键字:spring boot 1.5.8整合Activiti6.0及其Activiti-modeler(web版流程设计器)demo

    程序源代码
  • Activiti工作流学习笔记(三)——自动生成28张数据库表的底层原理分析

    网上关于工作流引擎Activiti生成表的机制大多仅限于四种策略模式,但其底层是如何实现的,相关文章还是比较少,因此,觉得撸一撸其生成表机制的底层原理。

    朱季谦
  • SpringBoot2.x+mybatis plus3.x集成Activit7版本

    最近在参与一个开源项目ruoyi-vue-pro,暂时负责Activiti7工作流的搭建,接这个任务一个原因,是比较好奇Activiti7版本与先前的5、6版本...

    朱季谦
  • Activiti工作流框架学习笔记(二)之springboot2.0整合工作流Activiti6.0

    以前在工作当中做过不少与工作流Activiti有关的工作,当时都是spring集成activiti5.22的项目,现在回过头去看,其实版本已经稍微老了,因此,基...

    朱季谦
  • 第一节:实现Activiti6.0的第一个demo

    lib:存放需要使用的jar包,可从下面链接直接下载解压,记得加入将包加入项目中,如下: jar包提取码:c0zq

    凡人飞
  • 详述 Spring MVC 启动流程及相关源码分析

    熟悉 Spring MVC 的启动过程,有助于我们理解相关文件配置的原理,深入理解 Spring MVC 的设计原理和执行过程。

    CG国斌
  • SpringMVC 启动流程及相关源码分析你要知道的SpringMVC启动流程和源码分析都在这里

    你要知道的SpringMVC启动流程和源码分析都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/160...

    WWWWDotPNG
  • 模仿Activiti工作流自动建表机制,实现Springboot项目启动后自动创建多表关联的数据库与表的方案

    在一些本地化项目开发当中,存在这样一种需求,即开发完成的项目,在第一次部署启动时,需能自行构建系统需要的数据库及其对应的数据库表。

    朱季谦
  • Framework掌握不全被面试官怼?Android字节跳动大牛的精编解析笔记带你系统学习!

    通常作为一个Android APP开发者,我们并不关心Android的源代码实现,不过随着Android开发者越来越多,企业在筛选Android程序员时越来越看...

    Android技术干货分享
  • 第008课 第1个ARM裸板程序及引申(点亮LED灯)

    当我们学习C语言的时候,我们会写个Hello程序。那当我们写ARM程序,也该有一个简单的程序引领我们入门,这个程序就是点亮LED。

    韦东山
  • 作为一名Android工程师,了解Framework层对工作有什么帮助吗?

    作为一个应用开发工程师,在网上有看到过大家都说了解系统源码,例如四大组件启动流程及IPC,Binder通信原理这些。而且我也有去看过,也觉得源码写的确实很精彩。...

    Android技术干货分享
  • FPGA Xilinx Zynq 系列(十八)Zynq 的第一个工程

    今天给大侠带来FPGA Xilinx Zynq 系列第十八篇,本篇是第一部分 PART A的最后一篇,下一篇将开启PART B,Zynq SoC & 硬件设计。...

    FPGA技术江湖
  • 跳点搜索算法JPS及其优化

    寻路算法用途众多,例如在游戏和地图中。A*算法已经众所周知,对于其优化也是层出不穷,然而性能并没有取得突破性进展。本文介绍一种跳点搜索算法JPS以及其四个优化算...

    LemonLu
  • 消息中间件之Kafka集群跨区容灾迁移实践案例

    Kafka作为当今一款最为流行的高性能消息中间件,确保其高可用性并具备跨区容灾能力是很多企业运维人员的职责之一。现在我们将我们平时帮客户做kafka集群跨区容灾...

    邓愉悦
  • 2020线下商圈洞察报告:杭州商圈人流恢复率超80%

    “随着国内全面复工复产,“促消费强市场”成了下一阶段日常生活中的关键词。3月中旬,四川、安徽两省率先发声可有条件地摘口罩,南京、杭州、深圳等多地相继向市民发放消...

    数据猿
  • 完结撒花 | 全网稀有的Ambari自定义服务集成实战(全)

    自从 2020 年开始,我就发觉网上使用 Ambari 的同学多了很多,随着 cloudera 收购 hdp 并进入收费模式,越来越多的公司选择了 Ambari...

    create17
  • 单细胞分析十八般武艺4:velocyto

    单细胞初级8讲和高级分析8讲 单细胞分析十八般武艺1:harmony 单细胞分析十八般武艺2:LIGER 单细胞分析十八般武艺3:fastMNN

    生信技能树jimmy

扫码关注云+社区

领取腾讯云代金券