一、什么是Activiti?
Activiti 是一个开源的、基于Java的工作流与业务流程管理(BPM)平台。它支持 BPMN 2.0 标准,可以帮助企业实现流程自动化、审批流、任务分派等业务场景。Activiti易于集成到Spring、Spring Boot等主流Java框架,广泛应用于OA、ERP等系统。
二、核心概念
| 名称 | 说明 |
|---|
| 流程定义 | BPMN文件,描述业务流程的各个节点与流转规则。 |
| 流程实例 | 流程定义的具体一次执行过程。 |
| 任务(Task) | 流程中的具体操作节点,通常由用户或系统完成。 |
| 流程变量 | 流程执行过程中传递的参数或数据。 |
| 流程部署 | 将流程定义文件部署到引擎,成为可执行流程。 |
| 用户与组 | 流程任务的参与者、候选人、审批人等。 |
| 事件与监听器 | 流程执行过程中触发的事件及自定义处理逻辑。 |
三、核心架构与组件
- 流程引擎:核心,负责流程定义解析、流程实例管理、任务分配等。
- API服务:
- RepositoryService:流程定义与部署管理
- RuntimeService:流程实例管理
- TaskService:任务管理
- IdentityService:用户与组管理
- HistoryService:历史数据查询
- 数据库:持久化流程定义、实例、任务、变量、历史数据等。
- BPMN 2.0:流程描述语言,支持标准建模工具。
四、流程开发与运行机制
1. 流程设计
- 使用建模工具(如Activiti Designer、Web Modeler)设计流程图,导出BPMN文件。
- 流程图包括:开始节点、用户任务、服务任务、网关、结束节点等。
2. 流程部署
- 将BPMN文件部署到Activiti引擎,成为可执行流程。
- 可通过Java API、REST API等方式部署。
3. 流程启动
- 通过流程定义Key启动流程实例,可传递业务参数(流程变量)。
- 启动后流程实例按定义流转,自动/人工完成各节点任务。
4. 任务处理
- 用户查询自己的待办任务,完成后流程流转到下一个节点。
- 支持任务分配、签收、会签、加签等复杂场景。
- 可通过表单、页面与业务系统集成。
5. 流程变量与业务数据
- 流程变量贯穿整个流程,可用于条件判断、业务数据传递。
- 支持与业务系统的数据同步、回写。
6. 流程查询与追踪
- 查询流程实例状态、任务历史、流转轨迹。
- 支持流程图高亮显示、审批流可视化。
7. 流程结束与归档
- 流程执行到结束节点自动归档。
- 历史数据可用于统计分析、审计。
五、常见应用场景
- OA审批流(请假、报销、合同审批等)
- ERP订单流程
- 客户服务流程
- 供应链管理流程
- 业务自动化与集成
六、优缺点分析
优点:
- 开源免费,社区活跃。
- 支持BPMN 2.0标准,易于建模与扩展。
- 与Spring生态集成良好。
- 支持REST API,便于异构系统集成。
缺点:
- 高并发场景性能需优化。
- 对复杂业务规则需二次开发。
- UI建模工具较为基础,需结合第三方平台。
七、典型开发流程(代码示例)
// 1. 部署流程定义
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
.addClasspathResource("processes/leave.bpmn")
.deploy();
// 2. 启动流程实例
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> variables = new HashMap<>();
variables.put("employee", "张三");
ProcessInstance pi = runtimeService.startProcessInstanceByKey("leaveProcess", variables);
// 3. 查询并完成任务
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskAssignee("manager").list();
for(Task task : tasks) {
taskService.complete(task.getId(), Collections.singletonMap("approved", true));
}
七、表结构说明
1. 流程定义与部署相关表
| 表名 | 说明 |
|---|
| ACT_RE_DEPLOYMENT | 部署信息表,记录流程定义的部署数据。 |
| ACT_RE_PROCDEF | 流程定义表,记录流程定义的基本信息(如key、版本、名称等)。 |
| ACT_RE_MODEL | 流程模型表,存储通过模型编辑器设计的流程模型信息。 |
| ACT_GE_BYTEARRAY | 二进制数据表,存储流程定义文件(如bpmn、png等)及表单等二进制数据。 |
2. 运行时数据表(正在执行的流程实例、任务等)
| 表名 | 说明 |
|---|
| ACT_RU_EXECUTION | 正在运行的流程实例和执行对象表,记录流程实例的执行状态。 |
| ACT_RU_TASK | 正在运行的任务表,记录用户任务的状态(待办、签收等)。 |
| ACT_RU_IDENTITYLINK | 运行时流程人员表,记录任务与参与者的关系(如候选人、代理人等)。 |
| ACT_RU_VARIABLE | 运行时流程变量表,存储流程实例中的变量数据。 |
| ACT_RU_JOB | 定时任务表,存储定时器、异步任务等信息。 |
| ACT_RU_EVENT_SUBSCR | 事件订阅表,存储事件监听相关数据。 |
3. 历史数据表(已完成的流程、任务、变量等)
| 表名 | 说明 |
|---|
| ACT_HI_PROCINST | 历史流程实例表,记录已结束或正在进行的流程实例信息。 |
| ACT_HI_ACTINST | 历史节点表,记录流程实例每个节点的执行历史。 |
| ACT_HI_TASKINST | 历史任务表,记录历史任务的办理情况。 |
| ACT_HI_VARINST | 历史变量表,记录流程实例中变量的历史数据。 |
| ACT_HI_DETAIL | 历史明细表,记录流程实例的详细历史数据(如变量修改明细)。 |
| ACT_HI_COMMENT | 历史意见表,记录任务办理过程中的评论、说明等。 |
| ACT_HI_ATTACHMENT | 历史附件表,记录流程办理过程中的附件信息。 |
4. 用户与权限相关表
| 表名 | 说明 |
|---|
| ACT_ID_USER | 用户信息表。 |
| ACT_ID_GROUP | 用户组信息表。 |
| ACT_ID_MEMBERSHIP | 用户与组的关系表。 |
| ACT_ID_INFO | 用户扩展信息表。 |
5. 其他辅助表
| 表名 | 说明 |
|---|
| ACT_GE_PROPERTY | 系统属性表,记录Activiti的一些全局配置信息(如版本号)。 |
6. 常见表用途举例
- ACT_RU_TASK:查询当前所有待办任务。
- ACT_HI_TASKINST:查询已办任务和任务流转历史。
- ACT_RU_VARIABLE/ACT_HI_VARINST:查询流程变量的当前值和历史值。
- ACT_RE_PROCDEF:查询流程定义的key、版本、部署信息等。
7. 表名命名规则
- ACT_RE_:Repository(流程仓库/定义相关)
- ACT_RU_:Runtime(运行时数据)
- ACT_HI_:History(历史数据)
- ACT_ID_:Identity(用户、组、权限)
- ACT_GE_:General(通用数据)
备注
- 不同版本表结构可能有细微差异,建议以实际数据库为准。
- 生产环境可根据业务需要清理历史表数据(如ACT_HI_*),以减小数据库体积。
八、开发示例
1、工作流开发整体流程
- 流程设计
- 流程部署
- 流程启动
- 流程任务处理
- 流程查询与追踪
- 流程结束与归档
2、详细开发步骤
2.1. 流程设计
2.2. 流程部署
2.3. 流程启动
- 通过流程定义 Key 启动流程实例。
- 可以传递业务参数(如请假天数、申请人等)。
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> variables = new HashMap<>();
variables.put("employee", "张三");
variables.put("days", 3);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess", variables);
2.4. 流程任务处理
- 查询当前用户的待办任务。
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskAssignee("manager").list();
- 完成任务(可带参数,如审批结果)。
Map<String, Object> variables = new HashMap<>();
variables.put("approved", true);
taskService.complete(task.getId(), variables);
2.5. 流程查询与追踪
2.6. 流程结束与归档
- 流程执行到结束节点自动结束。
- 可通过监听器或定时器做归档、通知等后续操作。
3、常见扩展点
- 流程监听器:实现流程流转时自动触发业务代码。
- 服务任务:集成自定义 Java 代码或外部系统。
- 表单与业务数据集成:与企业业务系统对接,动态表单、业务数据同步。
- 权限与多实例任务:支持会签、分派等复杂场景。