关于flowable流程引擎技术栈相关

关于flowable流程引擎技术栈相关

我们了解这个技术栈

其实可以从集合角度来了解,这个技术栈、

1.从背景和需求,为什么会需要这个技术栈

2.从引入依赖,到具体配置,怎么把这个技术栈

3.具体使用的一个小demo

4.提供了哪些概念和机制,来解决复杂的场景

一、背景与需求:为什么会需要 Flowable?

1.1 Flowable 是什么?

Flowable 是一个使用 Java 编写的轻量级业务流程引擎,常用于需要人工审批相关的业务,如请假、报销、采购等。作为一款开源 BPMN 2.0 流程引擎,Flowable 核心定位是为企业级应用提供轻量级、可扩展、高性能的业务流程自动化能力。

1.2 发展历程

Flowable 起源于 2016 年,由原 Activiti 核心开发团队创立。其前身可追溯至 jBPM 项目,后被 Alfresco 收购并发展为 Activiti。2016 年,开发团队因技术路线分歧从 Alfresco 独立,基于 Activiti 5.21 代码分支创建 Flowable。

关键版本演进:

  • 5.x 系列(2016-2018):继承 Activiti 基础功能,新增瞬态变量等特性;
  • 6.x 系列(2018-2023):引入抽象持久层、简化执行树、队列式作业执行,成为企业级主流选择;
  • 7.x 系列(2023 至今):基于 JDK 17 和 Spring Boot 3.x 重构,专注云原生场景。

1.3 为什么需要工作流引擎?

在企业应用开发中,业务流程的标准化、自动化管理是提升业务效率的核心需求。Flowable 的核心价值在于:

  • 工作流自动化:将业务流程分解为一系列任务,通过任务间的依赖关系自动控制流程执行;
  • BPMN 2.0 标准支持:Flowable 全面支持 BPMN 2.0 标准,允许开发者使用图形化工具定义复杂的业务流程;
  • 与 Spring Boot 无缝集成:在微服务架构盛行的今天,这使得开发者可以快速构建基于工作流的应用。

典型应用场景包括:请假审批流程、采购审批流程、报销审批流程等。

二、从依赖到配置:快速集成 Flowable

2.1 版本选择

Flowable 版本以 7.0.X 为分界线:

  • 使用 Spring Boot 3.x + JDK 17 → 选择 Flowable 7.x
  • 使用 Spring Boot 2.x + JDK 8 → 选择 Flowable 6.x

以 Spring Boot 2.7.18 + Flowable 6.8.1 为例。

2.2 Maven 依赖

pom.xml 中添加核心依赖:

xml 复制代码
<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- Flowable Spring Boot Starter -->
    <dependency>
        <groupId>org.flowable</groupId>
        <artifactId>flowable-spring-boot-starter</artifactId>
        <version>6.8.1</version>
    </dependency>
    
    <!-- MySQL 驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
    
    <!-- Lombok(可选) -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

2.3 数据库配置

application.yml 中配置数据源:

yaml 复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/flowable_demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

flowable:
  database-schema-update: true    # 自动更新表结构
  history-level: full              # 记录完整历史
  async-executor-activate: false  # 关闭异步任务(简单场景)

项目启动后,Flowable 会自动在数据库中创建以 ACT_ 开头的相关表。表分类规则:

  • ACT_RE_:存储"静态"信息,如流程定义与流程资源
  • ACT_RU_:存储运行时信息,如流程实例、用户任务

三、入门 Demo:请假审批流程

3.1 设计 BPMN 流程

src/main/resources/processes/ 目录下创建 leave-process.bpmn20.xml 文件:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"
                  targetNamespace="http://bpmn.io/schema/bpmn">
    
    <bpmn:process id="leaveProcess" name="请假流程" isExecutable="true">
        <!-- 开始事件 -->
        <bpmn:startEvent id="StartEvent_1"/>
        
        <!-- 提交申请任务 -->
        <bpmn:userTask id="submitTask" name="提交申请" 
                       flowable:assignee="${applicant}"/>
        
        <!-- 部门经理审批任务 -->
        <bpmn:userTask id="managerTask" name="部门经理审批" 
                       flowable:assignee="manager"/>
        
        <!-- HR 备案任务 -->
        <bpmn:userTask id="hrTask" name="HR备案" 
                       flowable:assignee="hr"/>
        
        <!-- 结束事件 -->
        <bpmn:endEvent id="EndEvent_1"/>
        
        <!-- 连线 -->
        <bpmn:sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="submitTask"/>
        <bpmn:sequenceFlow id="Flow_2" sourceRef="submitTask" targetRef="managerTask"/>
        <bpmn:sequenceFlow id="Flow_3" sourceRef="managerTask" targetRef="hrTask"/>
        <bpmn:sequenceFlow id="Flow_4" sourceRef="hrTask" targetRef="EndEvent_1"/>
    </bpmn:process>
</bpmn:definitions>

提示 :可使用 IDEA 插件 Flowable BPMN visualizer 可视化绘制流程图。

3.2 核心服务层实现

java 复制代码
@Service
@RequiredArgsConstructor
@Slf4j
public class LeaveProcessService {
    
    private final RepositoryService repositoryService;  // 仓库服务:部署流程
    private final RuntimeService runtimeService;        // 运行时服务:启动流程
    private final TaskService taskService;              // 任务服务:管理待办任务
    
    /**
     * 1. 部署流程定义
     */
    public Deployment deployProcess() {
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("processes/leave-process.bpmn20.xml")
                .name("请假审批流程")
                .deploy();
        log.info("流程部署成功,部署ID: {}", deployment.getId());
        return deployment;
    }
    
    /**
     * 2. 发起流程实例
     * @param processDefinitionKey 流程定义 Key(即 leaveProcess)
     * @param applicant 申请人
     */
    public ProcessInstance startProcess(String processDefinitionKey, String applicant) {
        // 设置流程变量
        Map<String, Object> variables = new HashMap<>();
        variables.put("applicant", applicant);
        
        ProcessInstance instance = runtimeService.startProcessInstanceByKey(
                processDefinitionKey, variables);
        log.info("流程启动成功,实例ID: {}", instance.getId());
        return instance;
    }
    
    /**
     * 3. 查询指定用户的待办任务
     */
    public List<Task> getTasksByAssignee(String assignee) {
        return taskService.createTaskQuery()
                .taskAssignee(assignee)
                .orderByTaskCreateTime().desc()
                .list();
    }
    
    /**
     * 4. 完成任务(审批)
     * @param taskId 任务ID
     * @param approved 是否通过
     */
    public void completeTask(String taskId, boolean approved) {
        Map<String, Object> variables = new HashMap<>();
        variables.put("approved", approved);
        taskService.complete(taskId, variables);
        log.info("任务完成,任务ID: {}", taskId);
    }
}

3.3 Controller 层(可选)

java 复制代码
@RestController
@RequestMapping("/api/leave")
@RequiredArgsConstructor
public class LeaveController {
    
    private final LeaveProcessService leaveProcessService;
    
    @PostMapping("/deploy")
    public ResponseEntity<?> deploy() {
        return ResponseEntity.ok(leaveProcessService.deployProcess());
    }
    
    @PostMapping("/start")
    public ResponseEntity<?> start(@RequestParam String applicant) {
        ProcessInstance instance = leaveProcessService.startProcess("leaveProcess", applicant);
        return ResponseEntity.ok("流程实例ID: " + instance.getId());
    }
    
    @GetMapping("/tasks/{assignee}")
    public ResponseEntity<?> tasks(@PathVariable String assignee) {
        return ResponseEntity.ok(leaveProcessService.getTasksByAssignee(assignee));
    }
    
    @PostMapping("/complete/{taskId}")
    public ResponseEntity<?> complete(@PathVariable String taskId, 
                                       @RequestParam boolean approved) {
        leaveProcessService.completeTask(taskId, approved);
        return ResponseEntity.ok("审批完成");
    }
}

3.4 执行示例

  1. 部署流程 :调用 /api/leave/deploy,将 BPMN 文件部署到引擎;
  2. 发起流程 :申请人调用 /api/leave/start?applicant=张三,流程实例启动,自动创建"提交申请"任务;
  3. 查询待办:员工查询并完成"提交申请"任务;
  4. 逐级审批:manager、hr 依次查询并完成各自审批任务;
  5. 流程结束:HR 审批通过后流程到达结束事件。

四、核心概念与机制

4.1 BPMN 2.0 核心元素

Flowable 严格遵循 BPMN 2.0 标准:

元素类型 说明 常见子类
事件 (Event) 流程生命周期中的节点 开始事件、结束事件、定时器事件、消息事件
任务 (Task) 流程中的工作单元 用户任务(UserTask)、服务任务(ServiceTask)、脚本任务(ScriptTask)
网关 (Gateway) 控制流程分支与合并 排他网关(X)、并行网关(+)、包容网关(O)
顺序流 (Sequence Flow) 元素之间的连接器 可设置条件表达式

示例:一个请假审批流程包含"开始事件→用户任务(提交申请)→排他网关(判断天数)→部门经理审批/总经理审批→结束事件"。

4.2 核心服务 API

Flowable 提供了多个核心服务接口:

服务 用途
RepositoryService 部署与管理 BPMN 模型文件,操作流程定义
RuntimeService 启动流程实例、设置流程变量、触发事件
TaskService 管理用户任务:任务分配、签收、完成等
HistoryService 查询流程实例的历史记录,用于审计和分析
IdentityService 用户与组管理,支持自定义身份验证

4.3 关键概念

  • 流程定义 (Process Definition):BPMN 文件解析后的静态流程模板;
  • 流程实例 (Process Instance):根据模板创建的运行时流程实例,一个流程定义可启动多个实例;
  • 执行流 (Execution):流程实例的运行轨迹,采用"令牌(Token)"机制跟踪流程执行路径;
  • 流程变量 (Process Variable):存储流程运行过程中的业务数据,如申请人、审批结果等。

4.4 高级机制

Flowable 提供丰富的扩展机制以应对复杂场景:

  • 动态流程变更:在运行时修改流程定义,支持版本间迁移和兼容;
  • 多实例任务(会签):处理并行审批(如多人会签)或循环任务,自动汇总执行结果;
  • 边界事件:捕获流程中的异常(如超时、错误),触发补偿逻辑或通知;
  • 外部任务模块:支持将流程中的任务剥离到外部系统执行,实现流程引擎与业务系统的解耦;
  • 事件注册与处理:提供事件定义、注册、分发、复杂事件处理能力,支持事件与流程联动;
  • REST API:提供标准化的 REST 接口,支持跨语言调用;
  • 服务任务:在流程中调用外部 HTTP 接口、Java 服务或脚本,实现与 CRM、ERP 等系统的数据交互。

4.5 数据库表结构

Flowable 的所有数据库表都以 ACT_ 开头,主要分为:

表前缀 用途 示例表
ACT_RE_ 仓库信息(流程定义、资源) ACT_RE_PROCDEF(流程定义)、ACT_RE_DEPLOYMENT(部署记录)
ACT_RU_ 运行时信息 ACT_RU_TASK(待办任务)、ACT_RU_EXECUTION(执行流)、ACT_RU_VARIABLE(流程变量)
ACT_HI_ 历史信息 ACT_HI_PROCINST(历史流程实例)、ACT_HI_TASKINST(历史任务)
ACT_ID_ 身份信息 ACT_ID_USER(用户)、ACT_ID_GROUP(组)
ACT_GE_ 通用数据 ACT_GE_BYTEARRAY(二进制资源,存储 XML 和流程图图片)

4.6 与其他工作流引擎的对比

Java 工作流领域中,Flowable、Activiti、Camunda 等框架各有千秋:

特性 Flowable Activiti Camunda
起源 Activiti 分支 原版 Activiti 分支
BPMN 2.0 ✅ 完整支持 ✅ 完整支持 ✅ 完整支持
Spring Boot 集成 ✅ 原生 starter ✅ 原生 starter ✅ 原生 starter
功能全面性 功能最全面 中等 最轻量
活跃度

这几个引擎可以说是"一家子",只要一个会用,其他上手很快。

总结

从集合角度看,Flowable 技术栈可以这样理解:

  1. 为什么需要:解决企业中流程审批自动化、复杂业务编排、跨系统任务调度等场景的标准化管理需求;
  2. 怎么集成 :通过 flowable-spring-boot-starter 依赖 + 数据库配置,Spring Boot 自动完成引擎初始化和表结构创建;
  3. 入门 Demo:BPMN 文件定义流程 → RepositoryService 部署 → RuntimeService 启动 → TaskService 完成任务;
  4. 核心机制:BPMN 2.0 规范、事件-任务-网关元素体系、四大核心服务 API,以及动态变更、多实例、边界事件等高级扩展机制。
相关推荐
倒流时光三十年7 小时前
第十八章 搜索历史保存功能实现记录
spring boot·微信小程序
倒流时光三十年7 小时前
第十七章 投票页面增加搜索功能
spring boot·微信小程序
郑洁文8 小时前
基于Springboot的足球青训俱乐部管理系统的设计与实现
java·spring boot·后端·足球青训俱乐部管理系统
我登哥MVP8 小时前
Spring Boot 从“会用”到“精通”:自定义参数绑定原理
java·spring boot·后端·spring·servlet·maven·intellij-idea
小江的记录本9 小时前
【Spring全家桶】Spring AI核心原理、大模型集成、Prompt工程、RAG实现、AI Agent开发(附《思维导图》+《面试高频考点清单》)
java·人工智能·spring boot·后端·spring·面试·prompt
云烟成雨TD9 小时前
Spring AI 1.x 系列【40】MCP 客户端 Spring Boot 启动器
人工智能·spring boot·spring
小江的记录本10 小时前
【Spring全家桶】Spring Cloud 2023.0.x:配置中心:Nacos Config、Apollo(附《思维导图》+《面试高频考点清单》)
java·spring boot·后端·python·spring·spring cloud·面试
huipeng92610 小时前
企业级微服务开发实战(三):公共模块设计与统一规范封装
java·spring boot·spring cloud·微服务·架构·系统架构·php
我登哥MVP11 小时前
Spring Boot 从“会用”到“精通”:参数绑定体系全景
java·spring boot·spring·servlet·maven·intellij-idea·mybatis