Activiti核心概念
在介绍核心API前,我们先要明确流程定义、流程实例和执行实例这几个基本概念,后续会反复用 到这些概念。
流程定义
一个流程模型通过执行部署操作可以生成一个流程定义,执行几次部署操作就可以生成几个流程定义。 通常流程模型修改后,都需要执行部署操作发布新版本的流程定义。所以,一个流程模型可能会部署多个版 本的流程定义,二者之间是一对多的关系。一个流程定义包括.bpmn和.png两个文件。.bpmn文件是流程步骤的说明,是遵循BPMN 2.0标准的XML文件。由于该文件内容较长,此处不再展开介绍。.png文件是Activiti生成的流程图片。下面是一个简单的请假流程图。
流程定义对应的数据表是ACT_RE_PROCDEF,该表存储了流程定义的基本信息。而.bpmn和.png文件则 存储在资源表ACT_GE_BYTEARRAY中,两个表的数据通过DEPLOYMENT_ID_字段进行关联。
流程实例
流程定义部署后,用户(或系统)即可调用Activiti的核心API根据流程定义发起一个流程实例,并通过 该API管理该流程实例的执行。一个流程定义可以发起多个流程实例。流程定义是静态的,流程实例是动态 的。例如,请假流程部署后,张三要申请年假需要发起一个请假流程实例,李四要申请病假也 需要发起一个请假流程实例,这两个流程实例互不影响。流程定义和流程实例的关系如图所示。
流程定义与流程实例的关系类似Java类与对象,一个Java类可以实例化多个对象,一个流程定义也可以
发起多个流程实例。
流程实例对应的数据表是ACT_HI_PROCINST,该表存储了流程实例的基本信息,而流程实例的节点信
息主要存储在ACT_HI_ACTINST表中,流程任务信息主要存储在ACT_HI_TASKINST表中,流程变量信息
主要存储在ACT_HI_VARINST表中。ACT_HI_PROCINST为主表,其他表通过PROC_INST_ID_字段与
ACT_HI_PROCINST表的ID_字段关联。
执行实例
在Activiti中每启动一个流程就会创建一个流程实例,每个流程实例至少会有一个执行实例,当流程执行 过程中遇到并行分支或多实例任务时,就会生成多个执行实例。下图所示为包含并行网关的流程示例。
流程启动后,会在ACT_RU_EXECUTION表中创建两个执行实例,一个是流程的主执行实例, 另一个是子执行实例。流程每执行一步操作,都会更新子执行实例,来表明当前流程的执行进度。当流程流 经第一个并行网关后,会新增2个子执行实例,此时共有3个子执行实例。再加上流程的主执行实例,一共可 以在ACT_RU_EXECUTION表中查询到4个执行实例。所有的子执行实例都按照规则执行完毕时,流程主执 行实例也随之结束。
执行实例对应的数据表是ACT_RU_EXECUTION,该表存储了执行实例的基本信息,而执行实例的任务 信息主要存储在ACT_RU_TASKINST表中,执行实例的变量信息主要存储在ACT_RU_VARINST表中。 ACT_RU_EXECUTION为主表,其他表通过EXECUTION_ID_字段与ACT_RU_EXECUTION表的ID_字段关联。
工作流引擎服务
ProcessEngine接口是Activiti的门面接口,也是最重要的API,其他核心服务API都可以通过ProcessEngine
接口来获取。Activiti核心API主要包括以下8个,分别介绍如下。
- RepositoryService:提供流程部署和流程定义的操作方法,如流程定义的挂起、激活等。
- RuntimeService:提供运行时流程实例的操作方法,如流程实例的发起、流程变量的设置等。
- TaskService:提供运行时流程任务的操作方法,如任务的创建、办理、指派、认领和删除等。
- HistoryService:提供历史流程数据的操作方法,如历史流程实例、历史变量、历史任务的查询等。
- ManagementService:提供对工作流引擎进行管理和维护的方法,如数据库表数据、表元数据的查询 和执行命令。
- IdentityService:提供用户或者组的操作方法,如用户的增、删、改、查等。
- FormService:提供流程表单的操作方法,如表单获取、表单保存等
- DynamicBpmnService:提供流程定义的动态修改方法,从而避免重新部署它。 这些核心API构成了Activiti的系统服务结构,如图所示。
activiti.cfg.xml是工作流引擎的配置文件。ProcessEngineConfiguration是工作流引擎的配置类, 根据activiti.cfg.xml创建。通过ProcessEngineConfiguration可以创建ProcessEngine实例,在Activiti中,一个
ProcessEngine实例代表一个工作流引擎,示例代码如下:
//加载工作流引擎配置
ProcessEngineConfiguration configuration = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//创建ProcessEngine对象
ProcessEngine processEngine = configuration.buildProcessEngine();
以上代码段通过调用ProcessEngineConfiguration的createProcessEngineConfigurationFromResource()方法加载了工作流引擎的配置文件activiti.cfg.xml,创建了一个工作流引擎配置类实例对象configuration,并调用configuration的buildProcessEngine()方法创建了一个工作流引擎对象processEngine。通过processEngine可以获取Activiti所有核心API服务,示例代码如下:
//获取存储服务RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//获取运行时服务RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//获取任务服务TaskService
TaskService taskService = processEngine.getTaskService();
//获取历史服务HistoryService
HistoryService historyService = processEngine.getHistoryService();
//获取表单服务FormService
FormService formService= processEngine.getFormService();
//获取身份服务IdentityService
IdentityService identityService = processEngine.getIdentityService();
//获取管理服务ManagementService
ManagementService managementService = processEngine.getManagementService();
//获取动态BPMN服务DynamicBpmnService
DynamicBpmnService dynamicBpmnService = processEngine.getDynamicBpmnService();