一、工作流核心概念
1.1 什么是工作流?
工作流(Workflow)是将业务过程分解为定义良好的任务、角色和规则,通过计算机系统自动执行和监控的技术。就像工厂的流水线,每个环节都有明确的处理规则和传递路径。
1.2 Activiti的四大核心对象
概念 | 类比解释 | 数据库表示例 |
ProcessDefinition(流程定义) | 设计图纸 | ACT_RE_PROCDEF |
ProcessInstance(流程实例) | 按图纸建造的建筑 | ACT_RU_EXECUTION |
Task(任务) | 工人需要完成的具体工序 | ACT_RU_TASK |
Identity(身份) | 工人和工种的关系表 | ACT_ID_*系列表 |
1.3 BPMN 2.0规范
业务流程建模符号标准,使用XML定义流程图。常见元素:
xml
<process id="leaveProcess" name="请假流程">
<startEvent id="start"/>
<userTask id="leaderAudit" name="主管审批"/>
<exclusiveGateway id="decision"/>
<endEvent id="end"/>
</process>
二、Activiti架构原理
2.1 引擎核心组件
mermaid
graph TD
A[ProcessEngine] --> B[RepositoryService]
A --> C[RuntimeService]
A --> D[TaskService]
A --> E[HistoryService]
A --> F[IdentityService]
B -->|管理流程定义| G[部署流程文件]
C -->|控制流程实例| H[启动/推进流程]
D -->|处理任务| I[签收/完成任务]
E -->|历史数据| J[流程审计]
2.2 流程驱动机制
- 部署阶段:解析BPMN文件生成流程定义
- 运行阶段:通过命令模式执行流程跳转
- 持久化:使用MyBatis将运行时数据存入数据库
- 事务控制:每个流程操作都在独立事务中完成
三、快速配置指南
3.1 Spring Boot集成
xml
<!-- pom.xml -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M6</version>
</dependency>
3.2 数据库配置
yaml
# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/activiti?useUnicode=true
username: root
password: 123456
activiti:
database-schema-update: true # 自动创建表
history-level: full # 完整历史记录
3.3 流程文件示例
创建
src/main/resources/processes/leave.bpmn20.xml:
xml
<definitions>
<process id="leave" name="请假流程">
<startEvent id="start"/>
<sequenceFlow sourceRef="start" targetRef="apply"/>
<userTask id="apply" name="填写申请"
activiti:assignee="${applicant}"/>
<sequenceFlow sourceRef="apply" targetRef="approve"/>
<userTask id="approve" name="经理审批"
activiti:candidateGroups="manager"/>
<sequenceFlow sourceRef="approve" targetRef="end"/>
<endEvent id="end"/>
</process>
</definitions>
运行 HTML
四、核心API实战
4.1 部署流程
java
@Autowired
private RepositoryService repositoryService;
public void deploy() {
repositoryService.createDeployment()
.addClasspathResource("processes/leave.bpmn20.xml")
.name("请假流程部署")
.deploy();
}
4.2 启动流程实例
java
@Autowired
private RuntimeService runtimeService;
public void startProcess(String applicant) {
Map<String, Object> variables = new HashMap<>();
variables.put("applicant", applicant);
runtimeService.startProcessInstanceByKey("leave", variables);
}
4.3 处理任务
java
@Autowired
private TaskService taskService;
public void completeTask(String taskId) {
Map<String, Object> variables = new HashMap<>();
variables.put("approved", true);
taskService.complete(taskId, variables);
}
五、可视化监控
5.1 Activiti Explorer
官方提供的Web控制台,可以:
- 查看流程定义
- 监控运行实例
- 执行任务操作
- 生成流程图
5.2 流程图高亮显示
java
ProcessDiagramGenerator diagramGenerator =
processEngine.getProcessEngineConfiguration()
.getProcessDiagramGenerator();
InputStream diagram = diagramGenerator.generateDiagram(
bpmnModel,
"png",
runtimeService.getActiveActivityIds(processInstanceId),
Collections.emptyList(),
"宋体",
"宋体",
null);
六、典型应用场景
6.1 请假审批流程
mermaid
graph LR
A[员工提交] --> B{经理审批}
B -->|同意| C[HR备案]
B -->|驳回| D[重新提交]
C --> E[流程结束]
6.2 订单处理流程
mermaid
graph TD
A[创建订单] --> B{金额检查}
B -->|>1000| C[主管复核]
B -->|<=1000| D[自动审核]
C --> E[财务处理]
D --> E
E --> F[发货]
七、常见问题排查
7.1 流程无法启动
- 检查流程定义是否部署成功
- 验证BPMN文件语法是否正确
- 确认启动时传递了必要的流程变量
7.2 任务不显示
- 检查任务候选人/组的设置
- 确认用户是否加入正确的组
- 查看ACT_RU_TASK表数据
八、最佳实践建议
- 流程版本控制:使用version字段管理流程变更
- 变量管理:避免存储大对象,优先使用基本类型
- 性能优化:
- 定期清理历史数据(ACT_HI_*)
- 使用异步服务(AsyncExecutor)
- 安全控制:
java
identityService.setAuthenticatedUserId("admin");
九、扩展学习方向
- 监听器开发:实现ExecutionListener和TaskListener
- 会签功能:使用Multi-instance特性
- 动态流程:通过RuntimeService修改运行中的流程
- 集成方案:与Spring Security结合实现权限控制
总结:
Activiti通过将业务流程抽象为可执行的模型,实现了业务逻辑与技术实现的解耦。建议从简单流程入手,逐步掌握以下技能树:
mermaid
graph TD
A[基础概念] --> B[流程设计]
B --> C[API使用]
C --> D[系统集成]
D --> E[性能优化]
E --> F[高级特性]
通过本文的学习路线,开发者可以在2周内快速掌握Activiti的核心用法,并在实际项目中实现以下典型流程:
- 审批类流程(OA系统)
- 订单处理流程(电商系统)
- 工单流转系统(客服系统)