前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第八节:Activiti6.0——启动流程相关

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

作者头像
凡人飞
发布2020-09-21 10:36:19
6570
发布2020-09-21 10:36:19
举报
文章被收录于专栏:指缝阳光

一、概述

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

二、执行流查看

  1. 一个分支的流程测试。
  • 流程图如下:
  • 使用代码直接进行部署
代码语言:javascript
复制
	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.关键代码如下:
代码语言:javascript
复制
	//获取流程定义
	ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();

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

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

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

  1. 流程图如下:
  1. 编码如下:
代码语言:javascript
复制
	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_不同:

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
  • 二、执行流查看
  • 三、启动流程的"BUSINESS_KEY_"
  • 四、执行流的本地(局部)变量和全局变量
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档