一、引言:当业务流程遇见 flowable
在企业级应用中,审批流程是绕不开的核心需求:从请假申请到合同审批,从报销流程到项目立项,标准化的工作流能显著提升协作效率。
传统硬编码实现审批逻辑,往往导致代码臃肿、维护困难,而 flowable 作为轻量级工作流引擎,与 spring boot 的结合堪称 “天作之合”。
本文将从 0 到 1 搭建一个完整的审批系统,涵盖流程设计、引擎集成、业务交互全流程,附可运行的生产级源码。
二、flowable 核心概念:重新定义流程管理
1. 三大核心组件
- 流程引擎(process engine):
flowable 的心脏,负责解析流程定义、管理流程实例、调度任务
- 流程定义(process definition):
可视化的流程蓝图,通过 bpmn 2.0 标准定义节点(开始 / 结束事件、用户任务、网关等)
- 任务(task):
流程执行过程中产生的待办事项,包含办理人、截止时间、表单数据等属性
2. 核心优势
- 轻量化:
独立于 spring 的引擎实现,最小依赖仅 2mb
- 兼容性:
完全兼容 activiti 5/6 流程文件,支持多数据库(mysql/postgresql/oracle)
- 扩展性:
提供 java api、rest 接口、表单引擎、决策表等扩展模块
三、实战准备:搭建开发环境
1. 创建 spring boot 项目
<!-- pom.xml 依赖 -->  
<dependencies>  
    <!-- flowable核心依赖 -->  
    <dependency>  
        <groupid>org.flowable</groupid>  
        <artifactid>flowable-spring-boot-starter-process</artifactid>  
        <version>6.8.0</version>  
    </dependency>  
    <!-- 数据库依赖(以mysql为例) -->  
    <dependency>  
        <groupid>mysql</groupid>  
        <artifactid>mysql-connector-java</artifactid>  
    </dependency>  
    <!-- web模块 -->  
    <dependency>  
        <groupid>org.springframework.boot</groupid>  
        <artifactid>spring-boot-starter-web</artifactid>  
    </dependency>  
</dependencies>  2. 配置数据库与引擎
# application.yml  
spring:  
  datasource:  
    url: jdbc:mysql://localhost:3306/flowable_demo?usessl=false&servertimezone=asia/shanghai  
    username: root  
    password: 123456  
  flowable:  
    database-schema-update: true  # 自动创建/更新数据库表  
    check-process-definitions: true  # 启动时检查流程定义  
    async-executor-activate: false  # 禁用异步执行器(简化开发)  四、流程建模:用 flowable designer 画审批蓝图
1. 设计请假审批流程
节点说明
- 开始事件(start event)
- 用户任务(user task):部门经理审批
- 排他网关(exclusive gateway):根据审批结果分支
- 结束事件(end event)
2. 导出流程文件
将设计好的流程保存为 leave-process.bpmn20.xml,放置在 src/main/resources/processes/ 目录下,核心定义如下:
<definitions xmlns="http://www.omg.org/spec/bpmn/20100524/model">  
  <process id="leaveprocess" name="请假流程">  
    <startevent id="startevent" />  
    <usertask id="managerapproval" name="部门经理审批">  
      <extensionelements>  
        <flowable:assignee>manager</flowable:assignee>  <!-- 办理人变量 -->  
      </extensionelements>  
    </usertask>  
    <exclusivegateway id="approvalgate" name="审批结果" />  
    <endevent id="approveend" name="审批通过" />  
    <endevent id="rejectend" name="审批拒绝" />  
    <!-- 流程连线定义 -->  
  </process>  
</definitions>  五、核心代码实现:从引擎集成到业务交互
1. 流程服务层(核心逻辑)
import org.flowable.engine.*;  
import org.flowable.engine.runtime.processinstance;  
import org.flowable.task.api.task;  
import org.springframework.stereotype.service;  
@service  
public class leaveprocessservice {  
    private final processengine processengine;  
    public leaveprocessservice(processengine processengine) {  
        this.processengine = processengine;  
    }  
    // 1. 发起请假流程  
    public string startprocess(string applicant, string reason, int days) {  
        runtimeservice runtimeservice = processengine.getruntimeservice();  
        processinstance processinstance = runtimeservice.startprocessinstancebykey(  
            "leaveprocess",  // 流程定义key  
            "process_" + uuid.randomuuid(),  // 流程实例id  
            map.of(  
                "applicant", applicant,  // 流程变量  
                "reason", reason,  
                "days", days  
            )  
        );  
        return processinstance.getid();  
    }  
    // 2. 处理审批任务  
    public void completetask(string taskid, string assignee, boolean approved) {  
        taskservice taskservice = processengine.gettaskservice();  
        task task = taskservice.createtaskquery()  
            .taskid(taskid)  
            .singleresult();  
        taskservice.claim(taskid, assignee);  // 认领任务  
        taskservice.complete(taskid, map.of("approved", approved));  // 提交审批结果  
    }  
    // 3. 查询用户待办任务  
    public list<task> gettasks(string assignee) {  
        return processengine.gettaskservice()  
            .createtaskquery()  
            .taskassignee(assignee)  
            .orderbytaskcreatetime()  
            .desc()  
            .list();  
    }  
}  2. 控制器层(rest 接口)
import org.springframework.web.bind.annotation.*;  
@restcontroller  
@requestmapping("/process")  
public class leaveprocesscontroller {  
    private final leaveprocessservice processservice;  
    // 发起流程  
    @postmapping("/start")  
    public responsedata startprocess(  
        @requestparam string applicant,  
        @requestparam string reason,  
        @requestparam int days  
    ) {  
        string processid = processservice.startprocess(applicant, reason, days);  
        return responsedata.success("流程启动成功", processid);  
    }  
    // 处理任务  
    @postmapping("/complete")  
    public responsedata completetask(  
        @requestparam string taskid,  
        @requestparam string assignee,  
        @requestparam boolean approved  
    ) {  
        processservice.completetask(taskid, assignee, approved);  
        return responsedata.success("任务处理完成");  
    }  
    // 查询待办任务  
    @getmapping("/tasks")  
    public responsedata gettasks(@requestparam string assignee) {  
        list<task> tasks = processservice.gettasks(assignee);  
        return responsedata.success("获取任务成功", tasks);  
    }  
}  3. 数据库表说明
flowable 自动创建以下核心表(以 mysql 为例):
| 表名 | 作用 | 
|---|---|
| act_re_procdef | 流程定义表 | 
| act_ru_instance | 运行时流程实例表 | 
| act_ru_task | 运行时任务表 | 
| act_hi_procinst | 历史流程实例表 | 
| act_hi_taskinst | 历史任务表 | 
六、深度解析:flowable 架构与 spring boot 的化学反应
1. 引擎初始化流程
- spring boot 自动配置:
flowableautoconfiguration 注册核心 bean(processengine、runtimeservice 等)
- 数据库初始化:
database-schema-update 自动创建 52 张表,支持四种策略(false/null/true/create-drop)
- 流程定义部署:
启动时扫描classpath:/processes/目录,自动部署 bpmn 文件
2. 事务管理机制
- 与 spring 事务集成:
流程操作(启动 / 完成任务)自动纳入 spring 事务
- 隔离级别:
通过@transactional注解控制,默认使用数据库默认隔离级别
- 异常处理:
流程执行失败时自动回滚,历史表记录失败事件
3. 性能优化点
// 优化查询性能(添加索引)  
@postconstruct  
public void createindex() {  
    managementservice managementservice = processengine.getmanagementservice();  
    managementservice.createindex("act_idx_task_assignee", "act_ru_task", "assignee_");  
}  七、生产环境最佳实践
1. 流程版本管理
// 部署新版本流程(保留历史版本)  
repositoryservice repositoryservice = processengine.getrepositoryservice();  
repositoryservice.createdeployment()  
    .name("请假流程v2.0")  
    .addclasspathresource("processes/leave-process-v2.bpmn20.xml")  
    .deploy();  2. 表单集成方案
- 内嵌表单:
在 bpmn 中定义flowable:formfield,通过taskservice.gettaskformdata()获取表单元数据
- 外置表单:
使用 flowable form 引擎,支持 html/css/javascript 自定义表单
3. 监控与审计
// 查询流程执行历史  
historyservice historyservice = processengine.gethistoryservice();  
list<historicprocessinstance> instances = historyservice  
    .createhistoricprocessinstancequery()  
    .processinstancebusinesskey("process_123")  
    .list();  4. 安全加固
- 权限控制:
通过 spring security 限制 api 访问,流程变量加密存储
- 防 sql 注入:
所有用户输入参数使用 mybatis 的#{}占位符,避免拼接 sql
八、总结:重新定义流程开发范式
通过 spring boot 与 flowable 的深度集成,我们实现了:
- 可视化流程建模:
业务人员可独立设计审批流程,减少技术依赖
- 低代码开发:
核心业务逻辑与流程引擎解耦,代码量减少 60% 以上
- 全生命周期管理:
从流程启动到历史追溯,提供完整的审计能力
在数字化转型的今天,工作流引擎不再是 “奢侈品”。flowable 与 spring boot 的组合,让中小企业也能快速搭建专业级审批系统。掌握这套技术栈,不仅能提升开发效率,更能让你在企业架构设计中占据先机 —— 毕竟,清晰的流程,才是高效协作的基石
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
 
             我要评论
我要评论 
                                             
                                             
                                             
                                             
                                             
                                            
发表评论