本文目录导读:

- 📚 目录导读(Table of Contents)
- 引言:为什么选择Activiti作为工作流引擎?
- 需求分析与流程设计:请假业务流程拆解
- 环境准备与依赖配置(Spring Boot + Activiti 7)
- 核心模型构建:BPMN 2.0 请假流程图详解
- 流程部署、启动与任务处理的代码实战
- 高级功能:会签、驳回与历史记录查询
- 常见问题与最佳实践(含FAQ问答)
- Activiti在企业应用中的价值与展望
📚 目录导读(Table of Contents)
- 引言:为什么选择Activiti作为工作流引擎?
- 需求分析与流程设计:请假业务流程拆解
- 环境准备与依赖配置(Spring Boot + Activiti 7)
- 核心模型构建:BPMN 2.0 请假流程图详解
- 流程部署、启动与任务处理的代码实战
- 高级功能:会签、驳回与历史记录查询
- 常见问题与最佳实践(含FAQ问答)
- Activiti在企业应用中的价值与展望
引言:为什么选择Activiti作为工作流引擎?
在当今的企业级应用开发中,审批流程(如请假、报销、采购)是高频刚需,Activiti作为一款轻量级、开源的BPMN 2.0工作流引擎,凭借其强大的流程可视化、高可扩展性以及与Spring生态的无缝集成,已成为Java技术栈中最流行的流程引擎之一,相较于jbpm或Flowable,Activiti在社区活跃度、文档完整度和REST API支持上更具优势,尤其适合中小型及快速迭代的企业项目。
根据谷歌SEO趋势分析,近两年“Activiti请假流程”、“Spring Boot Activiti”等关键词搜索量稳定上升,说明开发者对实战案例有极高的需求,本文摒弃枯燥的理论,直接通过一个完整的请假案例,带您走通从流程图设计到代码落地的全链路。
需求分析与流程设计:请假业务流程拆解
场景设定: 公司员工小王需要请假3天,流程需经过直属主管审批;若请假天数超过3天,则还需部门经理审批。
流程节点梳理:
- 开始事件 → 提交请假申请(填写表单) → 条件判断(天数≤3?) → [是] 主管审批 → 结束;[否] 主管审批 → 经理审批 → 结束。
- 每个审批节点包含“同意”和“驳回”两个网关分支。
设计要点: 利用独占网关(Exclusive Gateway) 处理分支判断,利用用户任务(User Task) 绑定审批人角色,流程需记录审批意见、时间以及最终状态。
环境准备与依赖配置(Spring Boot + Activiti 7)
技术栈选择: Spring Boot 2.7.x + Activiti 7.1.0.M6 + MyBatis Plus + MySQL 8.0。
关键Maven依赖示例(伪代码):
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M6</version>
</dependency>
配置核心属性: 在application.yml中设置数据库连接、自动部署开启(spring.activiti.database-schema-update: true)以及流程资源路径(spring.activiti.process-definition-location-prefix: classpath:/processes/)。
注意: 在Activiti 7中,默认使用Spring Security进行用户认证,简化时可配置内存用户。
核心模型构建:BPMN 2.0 请假流程图详解
使用Activiti Modeler或IDEA插件绘制leave.bpmn20.xml。核心节点定义如下:
- 开始事件(StartEvent): 无特殊属性。
- 用户任务(UserTask):
leave-apply:负责人设为${assignee}(流程变量)。manager-approve:负责人设为${manager}。
- 独占网关(Gateway): 判断条件表达式:
${days > 3},流向“经理审批”或“直接结束”。 - 结束事件(EndEvent): 终结节点。
BPMN源码片段摘要:
<bpmn:userTask id="managerApprove" name="部门经理审批"
activiti:assignee="${manager}"/>
<bpmn:exclusiveGateway id="gateway1" default="toEnd"/>
<bpmn:sequenceFlow id="flow1" sourceRef="gateway1"
targetRef="managerApprove">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">
<![CDATA[${days > 3}]]>
</bpmn:conditionExpression>
</bpmn:sequenceFlow>
流程部署、启动与任务处理的代码实战
(1)部署流程: 在Spring Boot启动类中,通过RepositoryService自动扫描并部署classpath下的BPMN文件。
(2)启动流程实例(Controller层):
Map<String, Object> vars = new HashMap<>();
vars.put("days", 4);
vars.put("manager", "zhangmg");
ProcessInstance pi = runtimeService.startProcessInstanceByKey("leaveProcess", vars);
(3)完成任务(带审批结论):
Task task = taskService.createTaskQuery()
.taskAssignee("user1").singleResult();
Map<String, Object> resultVars = new HashMap<>();
resultVars.put("approved", true);
taskService.complete(task.getId(), resultVars);
(4)动态驳回与流程终止: 若审批不通过,利用runtimeService.deleteProcessInstance()终止流程,或设置跳转节点实现驳回。
高级功能:会签、驳回与历史记录查询
- 会签(多实例): 设置
<multiInstanceLoopCharacteristics>,实现多人依次或同时审批,在请假场景中,可扩展为“部门全员会签”。 - 任意驳回: 通过
RuntimeService.createChangeActivityStateBuilder()实现节点跳转,如管理员驳回至“重新申请”。 - 历史记录:
HistoryService提供createHistoricProcessInstanceQuery()按流程实例ID查询实时状态、耗时与操作轨迹,可用于生成报表。
常见问题与最佳实践(含FAQ问答)
❓ 问答1:Activiti 7和6相比,最大的变化是什么?
答: Activiti 7彻底模块化,将工作流引擎与Spring Boot Starter解耦,同时强制要求配置Spring Security,且移除了基于MyBatis的旧版IDM管理界面,建议基于7.x标准API开发,并配套自定义用户体系。
❓ 问答2:流程节点长时间未处理,如何自动提醒?
答: 结合Quartz定时任务,每5分钟查询
ACT_RU_TASK表中任务创建时间,与当前时间比对,若超过阈值,则调用TaskService添加提醒或发送邮件。
❓ 问答3:多实例会签,如何动态指定审批人集合?
答: 在启动流程时,将
assigneeList作为集合变量传入,并在BPMN中设置<activiti:collection>${assigneeList}</activiti:collection>,引擎会自动为每个元素创建子任务。
最佳实践建议:
- 涉及金额或天数变动时,务必使用版本化管理流程定义,避免调试混乱。
- 将所有BPMN文件放在
resources/processes目录,并在启动前利用xml持久化工具做语法校验。
Activiti在企业应用中的价值与展望
通过上述请假案例,我们已经实现了流程可视化配置、动态变量绑定、网关决策、历史数据追踪等核心功能,Activiti的价值不仅在于简化审批流代码,更在于它提供了业务与流程的优雅解耦,让非技术人员也能通过模型修改流程。
随着Activiti对Cloud Native和事件驱动架构的持续支持,它将在微服务编排场景中扮演更重要的角色。建议您下载本文案例源码,修改流程节点并部署演练,深切体会BPMN引擎带来的效率变革。
(本文基于搜索引擎多篇Activiti请假实战教程综合重构,已去除冗余表述,增补代码细节与故障排查要点,以确保内容深度符合谷歌SEO E-E-A-T标准。)