初识 Flowable 流程引擎:让业务流程管理变得简单

如果你经常在项目中遇到这些场景 —— 报销审批需要层层签字、请假流程要按部门逐级审批、订单状态变更需要多岗位协同处理,那么你一定需要了解流程引擎。作为一个在多个企业级项目中重度使用 Flowable 的开发者,今天我就带大家走进 Flowable 的世界,看看这个强大的流程引擎到底能解决什么问题。

一、什么是流程引擎?

简单来说,流程引擎就是一个 "业务流程自动化工具"。它能按照预先定义的流程规则,自动推动任务从一个节点流转到下一个节点,就像工厂里的流水线一样,让业务流程按规矩自动运行。

比如我们熟悉的请假流程:

  1. 员工提交请假申请
  1. 部门经理审批
  1. 人力资源部备案
  1. 通知员工审批结果

没有流程引擎时,我们可能需要用一堆 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:测试流程

  1. 启动流程:调用/startLeaveProcess?applicant=zhangsan&manager=lisi,返回流程 ID
  1. 张三查询待办:调用/getTasks?assignee=zhangsan,会看到 "员工提交请假申请" 任务
  1. 张三完成任务:调用/completeTask?taskId=xxx(taskId 从第二步获取)
  1. 李四查询待办:调用/getTasks?assignee=lisi,会看到 "部门经理审批" 任务
  1. 李四完成任务:调用/completeTask?taskId=xxx,流程结束

通过这几步,一个简单的请假流程就跑通了!

五、Flowable 的核心组件

Flowable 有几个核心服务接口,理解它们是学习的关键:

  • RepositoryService:管理流程定义(部署、查询、删除流程模型)
  • RuntimeService:管理流程实例(启动、暂停、查询流程实例)
  • TaskService:处理用户任务(查询待办、完成任务、认领任务)
  • HistoryService:查询历史数据(已完成的流程、任务、变量等)
  • IdentityService:管理用户和组(虽然实际项目中常与公司的用户系统集成)
  • FormService:处理流程表单(与流程关联的表单定义和提交)

六、Flowable 的适用场景

Flowable 不是银弹,它适合这些场景:

  • 有明确步骤和角色分工的审批流程(如报销、请假、采购)
  • 状态复杂且需要追踪的业务(如订单、工单)
  • 多部门协同的业务流程(如产品上线、合同审批)
  • 需要流程可视化和可配置的场景(非技术人员也能修改流程)

但对于简单的业务逻辑,强行使用流程引擎反而会增加复杂度。

七、总结

Flowable 流程引擎能帮我们从繁琐的流程控制代码中解放出来,让业务流程变得可视化、可配置、可追踪。它的核心价值在于:

  1. 解耦:业务流程逻辑与代码解耦,流程变更无需改代码
  1. 可视化:用流程图直观展示业务流程,便于沟通和理解
  1. 标准化:遵循 BPMN 2.0 标准,避免重复造轮子
  1. 可监控:提供流程监控工具,能及时发现流程卡点

下一篇文章,我会带大家深入 Flowable 的流程设计,教大家用 Flowable Modeler 可视化设计流程,以及如何处理更复杂的流程场景(如分支、并行、网关等)。如果你在使用 Flowable 时遇到过什么问题,或者有想了解的知识点,欢迎在评论区告诉我~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

练习时长两年半的程序员小胡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值