2.3 businessKey(业务标识 )
2.3.1 分析
需求:
查询系统中当前正在运行的流程有哪些?比如:要查询采购流程,包括信息:流程实例id、当前 运行的结点id、采购单号、采购单名称 、采购金额。 分析:
流程实例id、当前 运行的结点id 通过activiti的api 从activiti数据库查询。
采购单号、采购单名称 、采购金额这个字段在activiti数据库中是不存在的,应该从业务系统中查询。
思路 :
在启动每个流程实例时(比如采购流程),指定一个采购单id,将此采购单id记录到activiti的数据库中。 流程定义(.bpmn和png文件) 静态的 比如:定义采购流程 一个流程实例 一个流程实例 XXX创建一个采购单 张三创建一个采购单李四创建一个采购单(采购单号:XXX),这 (采购单号:001),这(采购单号:002),这时启动一个流程实例 时启动一个流程实例 时启动一个流程实例 动态的:流程的执行 动态的:流程的执行 动态的:流程的执行 启动时指定采购 单 id(XXX) 启动时指定采购 单启动时指定采购 单 id(001) id(002)
采购单id和每个流程实例一一对应,activiti中为了满足需求:在查询activiti的信息时关联查询业务信息。专门设置businessKey(业务标识 )
2.3.2 businessKey业务标识概念
业务标识:查询activiti的信息时关联查询业务信息要用到的一个标识,标识通常是业务表的一个主键。比如:如果启动一个采购流程,业务标识等于采购单id,如果启动一个请假流程,业务标识等于请假信息的id。
2.3.3 设置businessKey方法:
在启动一个流程实例时设置该流程实例对应的businessKey。
数据库表:
SELECT * FROM act_ru_execution #流程实例执行表
SELECT * FROM act_hi_procinst #流程实例历史 表
小结:
企业开发中,通常使用此方法启动一个流程实例,启动时指定流程实例对应业务标识 。
2.4 查询流程实例
2.4.1 需求:
查询系统中当前正在运行的流程有哪些?比如:要查询采购流程,包括信息:流程实例id、当前 运行的结点id、
采购单号、采购单名称 、采购金额。
2.4.2 实现方法
使用RuntimeService查询系统中当前正在运行的流程。
2.4.3 如果关联查询业务信息
思路:
在查询流程实例时,从processInstance中获取businesskey 根据businessKey查询业务系统数据库
2.4.4 关联查询业务信息的方法
流程实例id、当前 运行的结点id、采购单号、采购单名称 、采购金额(标记红的为业务信息)。 分析:
Activiti的processInstance对象不包括业务信息,需要单独创建一个pojo(包括业务信息和processInstance的信息)
这样作的意义:
通过service将activiti和业务系统控制层进行隔离。
代码思路:
2.5 挂起、激活流程实例(了解)
2.5.1 需求:
如果要删除流程实例:
方法1:通过级联删除流程定义将该流程定义下所有相关信息(包括流程实例)全部删除 注意:谨慎使用,通常是给超级管理使用。
方法2:不删除,暂停流程实例,好处:暂停后可以再恢复。
通常使用方法2。
2.5.2 根据流程定义挂起、激活
暂停或激活时指定流程定义id,该流程定义下所有流程实例全部暂停或激活。
如果流程定义暂停或激活,不能再启动该流程定义的流程实例了!!!
代码:
@Test
public void suspendOrActivateProcessDefinition() {
// 流程定义id
String processDefinitionId = \;
RepositoryService repositoryService = processEngine .getRepositoryService();
// 获得流程定义
ProcessDefinition processDefinition = repositoryService .createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).singleResult(); //是否暂停
boolean suspend = processDefinition.isSuspended(); if(suspend){
//如果暂停则激活,这里将流程定义下的所有流程实例全部激活
repositoryService.activateProcessDefinitionById(processDefinitionId, true,
null);
System.out.println(\流程定义:\+processDefinitionId+\激活\); }else{
//如果激活则挂起,这里将流程定义下的所有流程实例全部挂起
repositoryService.suspendProcessDefinitionById(processDefinitionId, true,
null);
}
System.out.println(\流程定义:\+processDefinitionId+\挂起\); }
2.5.3 根据流程实例挂起、激活
暂停或激活时指定流程实例id,对该流程实例进行暂停或激活。
如果该流程实例id暂停了,流程实例下的任务无法办理。