如果你经常在项目中遇到这些场景 —— 报销审批需要层层签字、请假流程要按部门逐级审批、订单状态变更需要多岗位协同处理,那么你一定需要了解流程引擎。作为一个在多个企业级项目中重度使用 Flowable 的开发者,今天我就带大家走进 Flowable 的世界,看看这个强大的流程引擎到底能解决什么问题。
一、什么是流程引擎?
简单来说,流程引擎就是一个 "业务流程自动化工具"。它能按照预先定义的流程规则,自动推动任务从一个节点流转到下一个节点,就像工厂里的流水线一样,让业务流程按规矩自动运行。
比如我们熟悉的请假流程:
- 员工提交请假申请
- 部门经理审批
- 人力资源部备案
- 通知员工审批结果
没有流程引擎时,我们可能需要用一堆 if-else 判断和数据库状态字段来实现,代码会变得臃肿且难以维护。而有了 Flowable,我们只需定义好这个流程的节点和规则,剩下的流转工作全由引擎自动完成。
二、为什么选择 Flowable?
在 Java 生态中,主流的流程引擎有 Activiti、Flowable、Camunda 等。Flowable 是从 Activiti 分支出来的开源项目,相比其他引擎,它有这些优势:
- 兼容性好:完全兼容 BPMN 2.0 规范(业务流程建模与 notation 标准),这意味着你用标准工具画的流程图,Flowable 都能直接运行
- 功能全面:支持流程引擎、工作流、表单引擎、决策引擎等一站式解决方案
- 社区活跃:更新迭代快,bug 修复及时,遇到问题容易找到解决方案
- 易于集成:能轻松与 Spring Boot、Spring Cloud 等主流框架集成
- 扩展性强:提供丰富的扩展点,可根据业务需求定制流程行为
三、Flowable 能解决哪些实际问题?
举几个我在项目中遇到的典型场景:
场景 1:审批流程自动化
公司的报销审批流程原来靠人工传递纸质单据,效率极低。用 Flowable 实现后:
- 员工在系统提交电子报销单
- 系统自动根据报销金额判断审批链(5000 元以下部门经理审批,以上需财务总监审批)
- 每个审批人会收到待办任务提醒
- 审批通过 / 驳回状态实时同步,员工可随时查看进度
- 整个流程可追溯,谁在什么时间做了什么操作一目了然
场景 2:状态机管理
电商平台的订单状态流转复杂(待支付→已支付→已发货→已完成→已评价),用 Flowable 的流程引擎可以:
- 定义每个状态的转换规则(比如 "待支付" 只能转换为 "已支付" 或 "已取消")
- 状态变更时自动触发后续操作(如 "已支付" 状态触发库存扣减)
- 避免非法状态转换(比如不能从 "已取消" 直接跳到 "已发货")
场景 3:多岗位协同工作
一个新产品上线需要产品、开发、测试、运营多个团队协同,Flowable 可以:
- 按顺序或并行分配任务(开发和测试可以并行进行)
- 设置任务超时提醒(如测试任务 3 天未完成自动提醒测试负责人)
- 统计各环节耗时,优化流程效率
四、快速上手:用 Flowable 跑通第一个流程
光说不练假把式,我们来搭建一个最简单的 Flowable 项目,跑通一个请假流程。
步骤 1:搭建 Spring Boot 项目
在 pom.xml 中添加依赖:
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>6.8.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
步骤 2:定义流程模型
在 src/main/resources/processes 目录下创建一个 XML 文件(Flowable 会自动扫描该目录),定义请假流程:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100524/BPMN20.xsd"
id="Definitions_1"
targetNamespace="http://flowable.org/examples">
<process id="leaveProcess" name="请假流程" isExecutable="true">
<!-- 开始节点 -->
<startEvent id="startEvent1" />
<!-- 员工提交申请 -->
<userTask id="submitTask" name="员工提交请假申请"
flowable:assignee="${applicant}" />
<sequenceFlow id="flow1" sourceRef="startEvent1" targetRef="submitTask" />
<!-- 经理审批 -->
<userTask id="managerApproval" name="部门经理审批"
flowable:assignee="${manager}" />
<sequenceFlow id="flow2" sourceRef="submitTask" targetRef="managerApproval" />
<!-- 结束节点 -->
<endEvent id="endEvent1" />
<sequenceFlow id="flow3" sourceRef="managerApproval" targetRef="endEvent1" />
</process>
</definitions>
这个流程很简单:开始→员工提交→经理审批→结束。
步骤 3:启动流程实例
编写一个 Controller 来启动流程:
@RestController
public class LeaveController {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
// 启动请假流程
@PostMapping("/startLeaveProcess")
public String startProcess(
@RequestParam String applicant, // 申请人
@RequestParam String manager) { // 经理用户名
// 设置流程变量
Map<String, Object> variables = new HashMap<>();
variables.put("applicant", applicant);
variables.put("manager", manager);
// 启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(
"leaveProcess", // 流程定义的id(对应XML中的process id)
variables
);
return "流程已启动,流程ID:" + processInstance.getId();
}
}
步骤 4:处理任务
添加处理任务的接口:
// 获取待办任务
@GetMapping("/getTasks")
public List<Task> getTasks(@RequestParam String assignee) {
return taskService.createTaskQuery()
.taskAssignee(assignee)
.list();
}
// 完成任务
@PostMapping("/completeTask")
public String completeTask(
@RequestParam String taskId,
@RequestParam(required = false) Map<String, Object> variables) {
taskService.complete(taskId, variables);
return "任务已完成";
}
步骤 5:测试流程
- 启动流程:调用/startLeaveProcess?applicant=zhangsan&manager=lisi,返回流程 ID
- 张三查询待办:调用/getTasks?assignee=zhangsan,会看到 "员工提交请假申请" 任务
- 张三完成任务:调用/completeTask?taskId=xxx(taskId 从第二步获取)
- 李四查询待办:调用/getTasks?assignee=lisi,会看到 "部门经理审批" 任务
- 李四完成任务:调用/completeTask?taskId=xxx,流程结束
通过这几步,一个简单的请假流程就跑通了!
五、Flowable 的核心组件
Flowable 有几个核心服务接口,理解它们是学习的关键:
- RepositoryService:管理流程定义(部署、查询、删除流程模型)
- RuntimeService:管理流程实例(启动、暂停、查询流程实例)
- TaskService:处理用户任务(查询待办、完成任务、认领任务)
- HistoryService:查询历史数据(已完成的流程、任务、变量等)
- IdentityService:管理用户和组(虽然实际项目中常与公司的用户系统集成)
- FormService:处理流程表单(与流程关联的表单定义和提交)
六、Flowable 的适用场景
Flowable 不是银弹,它适合这些场景:
- 有明确步骤和角色分工的审批流程(如报销、请假、采购)
- 状态复杂且需要追踪的业务(如订单、工单)
- 多部门协同的业务流程(如产品上线、合同审批)
- 需要流程可视化和可配置的场景(非技术人员也能修改流程)
但对于简单的业务逻辑,强行使用流程引擎反而会增加复杂度。
七、总结
Flowable 流程引擎能帮我们从繁琐的流程控制代码中解放出来,让业务流程变得可视化、可配置、可追踪。它的核心价值在于:
- 解耦:业务流程逻辑与代码解耦,流程变更无需改代码
- 可视化:用流程图直观展示业务流程,便于沟通和理解
- 标准化:遵循 BPMN 2.0 标准,避免重复造轮子
- 可监控:提供流程监控工具,能及时发现流程卡点
下一篇文章,我会带大家深入 Flowable 的流程设计,教大家用 Flowable Modeler 可视化设计流程,以及如何处理更复杂的流程场景(如分支、并行、网关等)。如果你在使用 Flowable 时遇到过什么问题,或者有想了解的知识点,欢迎在评论区告诉我~