第一章 “流程引擎启蒙课”
一、Activiti是谁?——工作流世界的“交通指挥官”
1. 定义与使命
- 官方人设:Activiti是一个轻量级、嵌入式的开源工作流引擎,专注管理业务流程(BPM)。
- 核心使命:让“纸质审批单”变成“自动流转的代码逻辑”,比如请假、报销等流程的自动化。
2. 出身背景
- 祖传基因:源自jBPM4,但后来“自立门户”,优化了API设计与性能。
- 江湖地位:与Flowable、Camunda并称“BPM三剑客”,但Activiti以简洁易用著称。
举个栗子🌰:
传统开发:手动写状态机控制流程 → 代码复杂如蜘蛛网🕸️
Activiti:用BPMN流程图定义规则 → 引擎自动驱动流程 → 代码清爽如清泉💧
二、Activiti的“七种武器”——核心组件解剖
Activiti引擎的战斗力,全靠这七大Service接口撑腰!
接口名称 | 职责 | 经典操作 |
---|---|---|
RepositoryService | 流程设计图管家(部署、删除) | deploy() 部署流程图 |
RuntimeService | 流程实例指挥官(启动、触发) | startProcessInstanceByKey() |
TaskService | 任务管理员(分配、完成) | complete() 完成任务 |
HistoryService | 历史记录侦探(审计、追溯) | createHistoricTaskInstanceQuery() |
IdentityService | 用户与组保安(权限管理) | createUser() 创建用户 |
FormService | 表单设计师(动态表单绑定) | getTaskFormData() 获取表单数据 |
ManagementService | 引擎运维师(数据库表管理) | databaseSchemaUpgrade() 升级表结构 |
代码快闪:
// 获取默认流程引擎(引擎核心)
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 调用RuntimeService启动流程
RuntimeService runtimeService = engine.getRuntimeService();
ProcessInstance instance = runtimeService.startProcessInstanceByKey("leaveProcess");
三、Activiti的“身体构造”——架构全景图
1. 分层架构(像汉堡包🍔)
- API层:开发者直接调用的Service接口(如
TaskService
)。 - 引擎核心层:解析BPMN、驱动流程流转的“大脑”。
- 持久层:与数据库交互,存储流程定义、运行数据。
2. 数据表分类(数据库里的秘密)
- ACT_RE_*:流程定义存储(如
ACT_RE_PROCDEF
存流程图元数据)。 - ACT_RU_*:运行时数据(如
ACT_RU_TASK
存当前任务)。 - ACT_HI_*:历史数据(如
ACT_HI_TASKINST
存已完成任务)。 - ACT_ID_*:身份数据(如
ACT_ID_USER
存用户信息)。
趣味问答❓:
Q:如果流程卡住了,该查哪张表?
A:先看ACT_RU_TASK
找卡住的任务,再用ACT_RU_EXECUTION
查执行堆栈!
四、Activiti能做什么?——真实世界应用场景
1. OA系统
- 请假、报销、采购审批自动化。
- 优势:状态流转可视化,避免“领导找不到审批单”。
2. 电商订单
- 订单审核→库存锁定→物流跟踪。
- 高级玩法:超时自动取消订单(定时事件)。
3. 金融风控
- 贷款审批多级校验,规则动态配置。
- 经典组合:Activiti + 规则引擎(如Drools)。
避坑指南⚠️:
- 简单流程用Activiti事半功倍,复杂状态机建议直接写代码!
五、Activiti vs jBPM——同门师兄弟的“爱恨情仇”
对比项 | Activiti | jBPM5 |
---|---|---|
架构 | 轻量级,嵌入式设计 | 重量级,依赖较多 |
API | 简洁直观,学习成本低 | 复杂,扩展性强 |
社区 | 国内开发者活跃 | 国际社区为主 |
适用场景 | 中小型业务流程 | 企业级复杂流程 |
选型口诀🔍:
- 求快求简单 → Activiti
- 要定制要复杂 → Camunda(Activiti分支)
六、课堂挑战——测测你的“流程脑”
-
选择题:流程运行时数据存在哪类表中?
A. ACT_RE_* B. ACT_RU_* C. ACT_HI_* -
实战题:画出请假流程的BPMN草图(Start→申请→审批→End),标注用户任务。