当前位置: 代码网 > it编程>编程语言>Java > SpringBoot集成Flowable实现工作流解读

SpringBoot集成Flowable实现工作流解读

2025年09月11日 Java 我要评论
一、引言:当业务流程遇见 flowable在企业级应用中,审批流程是绕不开的核心需求:从请假申请到合同审批,从报销流程到项目立项,标准化的工作流能显著提升协作效率。传统硬编码实现审批逻辑,往往导致代码

一、引言:当业务流程遇见 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 的组合,让中小企业也能快速搭建专业级审批系统。掌握这套技术栈,不仅能提升开发效率,更能让你在企业架构设计中占据先机 —— 毕竟,清晰的流程,才是高效协作的基石

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com