activiti学习4:流程文件的部署
activiti学习4:流程文件的部署
用bpmn规范定义好一个流程得到流程定义文件后,需要把该文件部署到activiti的数据库后,这个流程才可以使用。
activiti中和流程定义相关的操作都需要使用RepositoryService这个服务组件来进行。
activiti中所有的服务组件都需要通过流程引擎对象来获取
一、RepositoryService服务组件
这个组件中提供了一系列管理流程定义和流程部署的api,我们可以使用这个组件中的api来部署流程
1.1 RepositoryService实例对象的获取
使用流程引擎对象的实例方法processEngine.getRepositoryService();来获取RepositoryService
	@Test
	public void test1() {
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		RepositoryService repositoryService = processEngine.getRepositoryService();
		System.out.println(repositoryService);
	}
二、流程部署信息的描述,Deployment对象
在讲解如何部署流程前,我们先了解下activiti如何描述流程的部署信息。activiti用Deployment这个接口来描述流程的部署信息,并自己提供了实现类。对应activiti数据库中的一张表ACT_RE_DEPLOYMENT

三、流程的部署
activiti使用DeploymentBuilder这个类的对象来部署流程,从这个类的名字就可以看出它的功能,部署一个流程并返回描述这次部署信息的对象。
使用RepositoryService服务组件的对象来获取DeploymentBuilder对象
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
然后给这个deploymentBuilder添加要部署的流程文件的位置
deploymentBuilder.addClasspathResource("process/process.bpmn");
我这里是在resources目录下创建了process/process.bpmn流程定义文件,所以添加了这个路径
还可以为本次部署添加名称和分类
deploymentBuilder.name("vacation-test").category("test");
最后执行部署
Deployment deploy = deploymentBuilder.deploy();
观察数据库ACT_RE_DEPLOYMENT表,会发现多了一条部署记录。
完整的代码为
	@Test
	public void test1() {
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		RepositoryService repositoryService = processEngine.getRepositoryService();
		DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
		deploymentBuilder.addClasspathResource("process/process.bpmn");
		deploymentBuilder.name("vacation-test").category("test");
		Deployment deploy = deploymentBuilder.deploy();
		System.out.println(deploy);
	}
注意,默认情况下多次部署同一流程图在表中会产生多条记录,用部署时间字段用来做区分
3.1 过滤重复部署的问题
为了防止资源没有发生变化而再次执行部署方法产生的重复部署,可以调用DeploymentBuilder的enableDuplicateFiltering()方法,这里的过滤方式是先查询部署表,得到表中已有的部署对象集合,如果发现有一条部署记录与将要部署的对象相同,就不会重复部署。所以部署时设置的name,category,资源名称和内容,只要有一个不一样就不会被过滤掉
deploymentBuilder.enableDuplicateFiltering();//设置过滤重复部署
四、部署信息的管理
activiti在DeploymentQuery这个接口中封装了管理部署信息的api,并自己提供了实现类,通过repositoryService服务组件来获取其实现类对象。
DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();
4.1 查询部署信息
@Test
	public void test2() {
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		RepositoryService repositoryService = processEngine.getRepositoryService();
		DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();
		//根据deploymentId查询
		String deploymentId="4201";
		Deployment singleResult = deploymentQuery.deploymentId(deploymentId)
				.deploymentName("vacation-test").singleResult();
		System.out.println(singleResult);
	}
查询时,先给deploymentQuery对象拼接查询条件,这里支持链式编程,先一个个的拼接查询条件,最后这个
singleResult()方法执行查询,返回一个结果;如果根据设定的条件返回多个结果,调用singleResult()就会抛出异常,这时需要调用返回多个结果的查询方法list()
4.2 删除部署信息
因为部署信息表与其他表有外键关联,所以直接删除部署表中的数据是删不掉的,需要调用RepositoryService中的删除方法来删除
	@Test
	public void test3() {
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		RepositoryService repositoryService = processEngine.getRepositoryService();
		String deploymentId="4201";
		boolean cascade=true;
		repositoryService.deleteDeployment(deploymentId, cascade);
	}
其中第2个参数cascade表示是否级联删除其他表的数据,直接给true就可以
五、流程定义及其管理
5.1 流程定义信息的描述
一个流程文件部署成功后,不仅会在部署表中记录部署信息,同时也会在流程定义表act_re_procdef中添加一条流程定义信息,描述被部署的流程文件所定义的流程。

注意其中的这个KEY_字段对应的就是流程定义文件中的process节点的id,activiti开启流程时要使用这个字段。
<process id="process" isExecutable="true">
    <startEvent id="sid-26F630F1-0761-4247-8383-F63F913A310E"></startEvent>
    <userTask id="usertask1" name="apply vecation" activiti:assignee="kermit"></userTask>
    <sequenceFlow id="sid-85398367-B674-473A-B7AC-268635F0DF5D" sourceRef="sid-26F630F1-0761-4247-8383-F63F913A310E" targetRef="usertask1"></sequenceFlow>
    <userTask id="usertask2" name="manager agree" activiti:assignee="kermit"></userTask>
    <sequenceFlow id="sid-5372C6B1-7359-40AB-B0A4-3FF06F20790E" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <endEvent id="sid-F621C8EF-13A5-4A49-BD5B-708BFB066576"></endEvent>
    <sequenceFlow id="sid-BCF9087D-36F4-4EDE-BD88-013AC74AB93A" sourceRef="usertask2" targetRef="sid-F621C8EF-13A5-4A49-BD5B-708BFB066576"></sequenceFlow>
  </process>
和部署信息一样,activiti也有一个接口来描述这张表的信息,ProcessDefinition,并自己提供了实现类
5.2 流程定义信息的管理
activiti提供了ProcessDefinitionQuery这个接口,在其中封装了流程定义信息查询相关的api。查询对象的获取和使用与DeploymentQuery类似。
	@Test
	public void test1() {
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		RepositoryService repositoryService = processEngine.getRepositoryService();
		ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
		String processDefinitionKey="process";
		List<ProcessDefinition> list = processDefinitionQuery.processDefinitionKey(processDefinitionKey).list();
		for (ProcessDefinition processDefinition : list) {
			System.out.println(processDefinition);
		}
	}
六、总结
本文介绍了如何部署流程定义文件,以及对部署后生成的部署信息和流程定义信息的管理。
activiti学习4:流程文件的部署的更多相关文章
- activiti学习3:流程引擎对象和流程引擎配置对象
		
目录 activiti学习3:流程引擎对象和流程引擎配置对象 一.activiti的简单使用流程 二.流程引擎配置对象ProcessEngineConfiguration的介绍 三.activiti配 ...
 - WCF入门学习3-配置文件与部署iis
		
配置文件设置 --------------------------------------------------- 创建的时候都会有个配置文件,其实有一个WCF配置编辑器,右键就可以点出来设置. 需 ...
 - 【Activiti学习之一】Activiti入门
		
环境 JDK1.7 MySQL5.6 Tomcat7 Eclipse-Luna activiti 6.0 一.概念1.工作流(Workflow):是一系列相互衔接.自动进行的业务活动或任务.采用工作流 ...
 - Activiti 学习(二)—— Activiti 流程定义和部署
		
概述 在这一节,我们将创建一个 Activit 工作流,并启动这个流程,主要包含以下几个步骤: 定义流程,按照 BPMN 的规范,使用流程定义工具,用流程符号把整个流程描述出来 部署流程,把画好的流程 ...
 - activiti学习5:开启流程和流程前进
		
目录 activiti学习5:开启流程和流程前进 一.流程和任务的关系 二.开启流程 2.1根据流程定义key开启流程 三.查询用户任务 3.1 TaskQuery 四.完成任务 activiti学习 ...
 - activiti学习6:启动流程后动态获取流程图
		
目录 activiti学习6:启动流程后动态获取流程图 一.绘图原理 二.根据流程定义id绘图 三.根据流程实例id绘图 3.1 基本原理 3.2 当前节点的获取 3.3 走过的节点的获取 3.4 绘 ...
 - Activiti 学习(三)—— Activiti 流程启动并完成
		
Activiti 流程启动 流程定义部署后,就可以通过工作流管理业务流程了,也就是说前文部署的出差申请流程可以使用了.针对该流程,启动一个流程表示发起一个新的出差申请单,这就相当于 java 类与 j ...
 - Activiti 学习笔记记录(二)
		
上一篇:Activiti 学习笔记记录 导读:对于工作流引擎的使用,我们都知道,需要一个业务事件,比如请假,它会去走一个流程(提交申请->领导审批---(批,不批)---->结束),Act ...
 - Activiti学习——Activiti与Spring集成
		
转: Activiti学习——Activiti与Spring集成 与Spring集成 基础准备 目录结构 相关jar包 Activiti的相关jar包 Activiti依赖的相关jar包 Spring ...
 
随机推荐
- 014_matlab读取ecxel(直接导入)
			
视频教程:https://v.qq.com/x/page/c3039b5htwx.html 资料下载:https://download.csdn.net/download/xiaoguoge11/12 ...
 - yugabyte cdc 试用
			
目前yugabyte 的cdc 功能处于beta 阶段,应该也快实际可用了,以下是一个简单的试用 环境准备 使用docker-compose docker-compose 文件 version: '2 ...
 - kuma 学习三  组件说明
			
当前官方已经提供了两种可选的运行模式 通用模式 kubernetes 模式 kuma 组件说明 kuma-cp kuma 的控制面板 kuma-dp kuma 的数据面板 enovy 提供sideca ...
 - 常用方法 DataTable转换为Entitys
			
备注:摘自网上 有附地址 public static List<T> DataTableToEntities<T>(this DataTable dt) where T : c ...
 - CTSC 2017 游戏[概率dp 线段树]
			
小 R 和室友小 B 在寝室里玩游戏.他们一共玩了 $n$ 局游戏,每局游戏的结果要么是小 R 获胜,要么是小 B 获胜. 第 $1$ 局游戏小 R 获胜的概率是 $p_1$,小 B 获胜的概率是 $ ...
 - 钠 GZY整理贪心
			
目录 CF140C New Year Snowmen CF161B Discounts P1842 奶牛玩杂技 CF140C New Year Snowmen #include <bits/st ...
 - 关于golang-mod的使用方法
			
简单粗暴仅需要三步即可 $ go mod download $ go mod tidy $ go build -v 这里保持默认什么都不用添加,项目无需在 gopath里面 Vendoring mod ...
 - linux高性能服务器编程 (五) --Linux网络编程基础api
			
第五章 Linux网络编程基础api 1.主机字节序和网络字节序 字节序是指整数在内存中保存的顺序.字节序分为大端字节序.小端字节序. 大端字节序:一个整数的高位字节数据存放在内存的低地址处.低位字节 ...
 - 第01组 Alpha冲刺(2/6)
			
队名:007 组长博客: https://www.cnblogs.com/Linrrui/p/11861798.html 作业博客: https://edu.cnblogs.com/campus/fz ...
 - [BUAA软工]Alpha阶段项目展示
			
[冰多多]Alpha项目展示 冰多多项目: 语音coding 助手, alpha阶段目标: 语音辅助输入 一. 团队成员的简介和个人博客地址 成员 角色 个人博客地址 卓培锦 PM, 后端开发 htt ...