Activiti 6.x 工作流引擎实践指南
在构建具备多级审批能力的企业级系统(如安防门禁管控平台)时,硬编码状态流转难以应对流程变更、审计追溯与可视化监控等需求。为此,引入标准化工作流引擎成为关键决策。本文聚焦 Activiti 6.x 版本,围绕其核心机制、集成方式与典型用例展开技术实践说明。
框架选型依据
对比主流开源流程引擎,Activiti 在轻量性、Spring 生态兼容性及社区活跃度方面表现突出。相较于 jBPM,其采用 MyBatis 实现高效 SQL 控制,原生支持 Spring Boot 自动装配,且提供完整的 REST API 与 Web 管理界面(Activiti Explorer),更适合快速嵌入已有 Java EE 架构中。Activiti 6.x 作为稳定分支,在 BPMN 2.0 规范支持、事务一致性及历史数据分离策略上已趋于成熟,因此被选定为项目基础流程支撑组件。
核心概念解析
- BPM(业务流程管理):一种以端到端流程建模、执行、监控与优化为核心的管理方法论,强调跨系统、跨角色的协同自动化。
- BPMN 2.0:由 OMG 组织制定的图形化建模标准,定义了活动(Activity)、网关(Gateway)、事件(Event)和连接线(Sequence Flow)等语义元素,确保流程设计可执行、可理解、可交换。
- 流程生命周期:涵盖模型设计(Modeling)、部署(Deployment)、实例启动(Start)、任务执行(Task Handling)、运行监控(Monitoring)与持续优化(Optimization)五个阶段。
Activiti 引擎架构概览
Activiti 以模块化方式组织功能,核心组件包括:
- ProcessEngine:主入口对象,用于获取全部服务接口;
- RepositoryService:管理 BPMN 流程定义、资源文件与版本控制;
- RuntimeService:启动/查询流程实例、传递流程变量、挂起/激活流程;
- TaskService:处理用户任务生命周期,包括分配、签收、完成与委托;
- HistoryService:访问已完成流程的历史记录,支持审计与报表生成;
- ManagementService:提供作业(Job)、数据库元信息、引擎配置等运维级操作。
开发环境搭建要点
使用 Maven 管理依赖,引入 Activiti 6.0.0 核心模块:
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
最小化配置示例如下(基于内存 H2 数据库):
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=-1" />
<property name="jdbcDriver" value="org.h2.Driver" />
<property name="databaseSchemaUpdate" value="true" />
<property name="history" value="full" />
</bean>
</beans>
请假审批流程实战
以下代码演示一个简化版两级审批流程:员工提交申请 → 部门负责人审批 → 流程结束。流程定义文件 leave2.bpmn.xml 包含 StartEvent、UserTask("领导审批")、ExclusiveGateway(判断是否通过)及 EndEvent。
@Test
public void executeLeaveApprovalFlow() {
// 初始化独立内存引擎
ProcessEngine engine = ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration()
.buildProcessEngine();
RepositoryService repo = engine.getRepositoryService();
RuntimeService runtime = engine.getRuntimeService();
TaskService taskSvc = engine.getTaskService();
HistoryService history = engine.getHistoryService();
// 部署流程定义
repo.createDeployment()
.addInputStream("leave2.bpmn", getClass().getResourceAsStream("/leave2.bpmn.xml"))
.deploy();
// 启动流程实例并传入变量
Map<String, Object> vars = new HashMap<>();
vars.put("applicant", "zhangsan");
vars.put("durationDays", 5);
ProcessInstance instance = runtime.startProcessInstanceByKey("leave2", vars);
// 查询待处理任务(候选人组:deptLeader)
Task approvalTask = taskSvc.createTaskQuery()
.taskCandidateGroup("deptLeader")
.singleResult();
assertNotNull(approvalTask);
assertEquals("领导审批", approvalTask.getName());
// 签收并完成任务
taskSvc.claim(approvalTask.getId(), "li4");
Map<String, Object> outcome = new HashMap<>();
outcome.put("isApproved", true);
taskSvc.complete(approvalTask.getId(), outcome);
// 验证流程是否成功结束
long finishedCount = history.createHistoricProcessInstanceQuery()
.finished()
.count();
assertEquals(1L, finishedCount);
}
执行后输出流程实例 ID 与定义 ID,表明流程已按 BPMN 图正确流转并终止。