1、Activiti是什么?
Activiti 是一个新兴的基于 Apache 许可的支持 BPMN 2.0 标准的开源 BPM 产品。它是一个轻量级,可嵌入的 BPM 引擎,并且提供了功能丰富的开发和流程设计工具。
2、Activiti 基本架构和服务组件
Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项 BPM 业务功能 Activiti 流程引擎都以服务的形式提供给开发人员。通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的 BPM 应用程序。
上面是 Activiti 引擎的系统服务结构图,该图显示了引擎提供的所有功能组件,以下为七个服务的功能简介:
RepositoryService
Activiti 中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据 ( 例如 BPMN2.0 XML 文件,表单定义文件,流程定义图像文件等 ),这些文件都存储在 Activiti 内建的 Repository 中。Repository Service 提供了对 repository 的存取服务。
RuntimeService
在 Activiti 中,每当一个流程定义被启动一次之后,都会生成一个相应的流程对象实例。Runtime Service 提供了启动流程、查询流程实例、设置获取流程实例变量等功能。此外它还提供了对流程部署,流程定义和流程实例的存取服务。
TaskService
在 Activiti 中业务流程定义中的每一个执行节点被称为一个 Task,对流程中的数据存取,状态变更等操作均需要在 Task 中完成。Task Service 提供了对用户 Task 和 Form 相关的操作。它提供了运行时任务查询、领取、完成、删除以及变量设置等功能。
IdentityService
Activiti 中内置了用户以及组管理的功能,必须使用这些用户和组的信息才能获取到相应的 Task。Identity Service 提供了对 Activiti 系统中的用户和组的管理功能。
ManagementService
Management Service 提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护。
HistoryService: History Service
用于获取正在运行或已经完成的流程实例的信息,与RuntimeService中获取的流程信息不同,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化。
FormService
Activiti 中的流程和状态 Task 均可以关联业务相关的数据。通过使用FormService可以存取启动和完成任务所需的表单数据并且根据需要来渲染表单。
3、网关介绍
网关是用来控制流程执行的,在Activiti中,总共有四种网关:
3.1 排他网关(Exclusive Gateway)
排他网关用在流程中对决策进行建模。当流程执行到达此网关时,所有接下来的流程按照它们定义规则进行判断,当判断结果为真时,就继续执行该流程。
3.2 并行网关(Parallel Gateway)
网关也可以用来处理流程中的并发建模。在流程模型中引入并发的最直接方式是使用并行网关,它允许分支到多个执行路径或合并已经执行完成的路径。
并行网关的功能是基于进入和外出的顺序流的:
- 分支(fork):并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
- 汇聚(join):所有到达并行网关,在此等待的进入分支,直到所有进入顺序流的分支都到达以后,流程就会通过汇聚网关。
3.3 包容网关(Inclusive Gateway)
包含网关可以看做是排他网关和并行网关的结合体。和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析它们。但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关一样。
包含网关的功能是基于进入和外出顺序流的:
- 分支:所有外出顺序流的条件都会被解析,结果为true的顺序流会以并行方式继续执行, 会为每个顺序流创建一个分支。
- 汇聚:所有并行分支到达包含网关,会进入等待章台,直到每个包含流程token的进入顺序流的分支都到达。这是与并行网关的最大不同。换句话说,包含网关只会等待被选中执行了的进入顺序流。 在汇聚之后,流程会穿过包含网关继续执行。
注意:如果同一个包含节点拥有多个进入和外出顺序流, 它就会同时 含有分支和汇聚功能 。 这时,网关会先汇聚所有拥有流程token的进入顺序流, 再根据条件判断结果为true的外出顺序流,为它们生成多条并行分支。
3.4 基于事件网关(Event-based Gateway)
基于事件网关允许根据事件判断流向。网关的每个外出顺序流都要连接到一个中间捕获事件。当流程到达一个基于事件网关,网关会进入等待状态:会暂停执行。 与此同时,会为每个外出顺序流创建相对的事件订阅。
注意:基于事件网关的外出顺序流和普通顺序流不同。这些顺序流不会真的"执行"。相反,它们让流程引擎去决定执行到基于事件网关的流程需要订阅哪些事件。 要考虑以下条件:
- 基于事件网关必须有两条或以上外出顺序流。
- 基于事件网关后,只能使用 intermediateCatchEvent 类型。 (activiti不支持基于事件网关后连接ReceiveTask。)
- 连接到基于事件网关的 intermediateCatchEvent 只能有一条进入顺序流。
4、表结构介绍
Activiti使用到的表都是ACT_开头的。
ACT_RE_*:‘RE’表示repository(存储),RepositoryService接口所操作的表。带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。
ACT_RU_*:‘RU’表示runtime,运行时表-RuntimeService。这是运行时的表存储着流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。
ACT_ID_*:‘ID’表示identity (组织机构),IdentityService接口所操作的表。用户记录,流程中使用到的用户和组。这些表包含标识的信息,如用户,用户组,等等。
ACT_HI_*:‘HI’表示history,历史数据表,HistoryService。就是这些表包含着流程执行的历史相关数据,如结束的流程实例,变量,任务,等等
ACT_GE_*:全局通用数据及设置(general),各种情况都使用的数据。
详细说明每张表:
ACT_EVT_LOG 事件日志
ACT_GE_BYTEARRY xml, png等二进制内容
ACT_GE_PROPERTY 引擎版本信息
ACT_HI_ACTINST 历史节点
ACT_HI_ATTACHMENT 历史附件
ACT_HI_COMMENT 历史意见表
ACT_HI_DETAIL 历史详情表,提供历史变量的查询
ACT_HI_IDENTITYLINK 历史参与者
ACT_HI_PROCINST 历史流程实例
ACT_HI_TASKINST 历史任务实例
ACT_HI_VARINST 历史变量实例
ACT_ID_GROUP 用户组信息表
ACT_ID_INFO 用户的人员详细信息
ACT_ID_MEMBERSHIP 用户与群组关系
ACT_ID_USER 用户的基本信息
ACT_PROCDEF_INFO 流程定义的动态变更信息
ACT_RE_DEPLOYMENT 部署信息表
ACT_RE_MODEL 模型(用于Web Designer)
ACT_RE_PROCDEF 流程定义数据
ACT_RE_EVENT_SUBSCR 事件监听
ACT_RU_EXECUTION 流程实例
ACT_RU_IDENTITYLINK 参与者
ACT_RU_JOB 异步作业
ACT_RU_TASK 任务节点
ACT_RU_VARIABLE 流程变量
5、事件监听机制
Activiti为我们提供了事件监听接口–ActivitiEventListener,ActivitiEventType则提供了各种可以监听到的事件类型,通过对应事件,获取有关联的用户,任务名称等。
public class OwnEventListener implements ActivitiEventListener {
@Override
public void onEvent(ActivitiEvent event) {
if (event.getType() == ActivitiEventType.TASK_CREATED
|| event.getType() == ActivitiEventType.TASK_ASSIGNED
|| event.getType() == ActivitiEventType.TASK_COMPLETED) {
ActivitiEntityEvent entityEvent = (ActivitiEntityEvent) event;
//获取到Task对象
TaskEntity taskEntity = (TaskEntity) entityEvent.getEntity();
//这里是发送邮件,也可以发送短信和微信等。
MailWrapper.getInstance()
.sendTaskMail(taskEntity.getOwner(), taskEntity.getAssignee(), taskEntity.getName(), event.getType());
}
}
}
当然,Activiti可以监听的事件远远不止任务类的,还包括如下:
public enum ActivitiEventType {
// 实体相关的
ENTITY_CREATED,
ENTITY_INITIALIZED,
ENTITY_UPDATED,
ENTITY_DELETED,
ENTITY_SUSPENDED,
ENTITY_ACTIVATED,
// 定时任务相关的
TIMER_SCHEDULED,
TIMER_FIRED,
JOB_CANCELED,
JOB_EXECUTION_SUCCESS,
JOB_EXECUTION_FAILURE,
JOB_RETRIES_DECREMENTED,
// 引擎相关的
ENGINE_CREATED,
ENGINE_CLOSED,
/**
* 活动相关的
*/
ACTIVITY_STARTED,
ACTIVITY_COMPLETED,
ACTIVITY_CANCELLED,
ACTIVITY_SIGNALED,
ACTIVITY_COMPENSATE,
ACTIVITY_MESSAGE_WAITING,
ACTIVITY_MESSAGE_RECEIVED,
ACTIVITY_ERROR_RECEIVED,
// 当BPMN抛出异常,但是流程中没有进行捕获时
UNCAUGHT_BPMN_ERROR,
// 变量相关的
VARIABLE_CREATED,
VARIABLE_UPDATED,
VARIABLE_DELETED,
// 任务相关的
TASK_CREATED,
TASK_ASSIGNED,
TASK_COMPLETED,
// 流程实例相关的
PROCESS_STARTED,
PROCESS_COMPLETED,
PROCESS_COMPLETED_WITH_ERROR_END_EVENT,
PROCESS_CANCELLED,
// 历史流程相关的
HISTORIC_PROCESS_INSTANCE_CREATED,
HISTORIC_PROCESS_INSTANCE_ENDED,
HISTORIC_ACTIVITY_INSTANCE_CREATED,
HISTORIC_ACTIVITY_INSTANCE_ENDED,
// 用户组相关的
MEMBERSHIP_CREATED,
MEMBERSHIP_DELETED,
MEMBERSHIPS_DELETED;
CUSTOM,
SEQUENCEFLOW_TAKEN;
}
6、相关资源
- Activiti6 官方网站
- Activiti6 用户指南
- Activiti6 API