开发者

SpringBoot集成Flowable实现工作流解读

开发者 https://www.devze.com 2025-08-15 12:02 出处:网络 作者: Java程序员 拥抱ai
目录一、引言:当业务流程遇见 Flowable二、Flowable 核心概念:重新定义流程管理1. 三大核心组件2. 核心优势三、实战准备:搭建开发环境1. 创建 Spring Boot 项目2. 配置数据库与引擎四、流程建模:用 Flowable Des
目录
  • 一、引言:当业务流程遇见 Flowable
  • 二、Flowable 核心概念:重新定义流程管理
    • 1. 三大核心组件
    • 2. 核心优势
  • 三、实战准备:搭建开发环境
    • 1. 创建 Spring Boot 项目
    • 2. 配置数据库与引擎
  • 四、流程建模:用 Flowable Designer 画审批蓝图
    • 1. 设计请假审批流程
    • 2. 导出流程文件
  • 五、核心代码实现:从引擎集成到业务交互
    • 1. 流程服务层(核心逻辑)
    • 2. 控制器层(REST 接口)
    • 3. 数据库表说明
  • 六、深度解析:Flowable 架构与 Spring Boot 的化学反应
    • 1. 引擎初始化流程
    • 2. 事务管理机制
    • 3. 性能优化点
  • 七、生产环境php最佳实践
    • 1. 流程版本管理
    • 2. 表单集成方案
    • 3. 监控与审计
    • 4. 安全加固
  • 八、总结:重新定义流程开发范式

    一、引言:当业务流程遇见 Flowable

    在企业级应用中,审批流程是绕不开的核心需求:从请假申请到合同审批,从报销流程到项目立项,标准化的工作流能显著提升协作效率。

    传统硬编码实现审批逻辑,往往导致代码臃肿、维护困难,而 Flowable 作为轻量级工作流引擎,与 Spring Boot 的结合堪称 “天作之合”。

    本文将从 0 到 1 搭建一个完整的审批系统,涵盖流程设计、引擎集成、业务交互全流程,附可运行的生产级源码。

    二、Flowable 核心概念:重新定义流程管理

    1. 三大核心组件

    • 流程引擎(Procjsess Engine):

    Flowable 的心脏,负责解析流程定义、管理流程实例、调度任务

    • 流程定义(Process Definition):

    可视化的流程蓝图,通过 BPMN 2.0 标准定义节点(开始 / 结束事件、用户任务、网关等)

    • 任务(Task):

    流程执行过程中产生的待办事项,包含办理人、截止时间、表单数据等属性

    2. 核心优势

    • 轻量化:

    独立于 Spring 的引擎实现,最小依赖仅 2MB

    • 兼容性:

    完全兼容 Activiti 5/6 流程文件,支持多数据库(mysql/PostgreSQL/oracle)

    • 扩展性:

    提供 Java API、REST 接口、表单引擎、决策表等扩展模块

    三、实战准备:搭建开发环境

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

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号