首页
/ 10分钟搞定流程自动化:Flowable BPMN 2.0可视化建模实战指南

10分钟搞定流程自动化:Flowable BPMN 2.0可视化建模实战指南

2026-02-05 04:04:14作者:滑思眉Philip

你是否还在为业务流程混乱、审批效率低下而烦恼?是否想通过代码实现流程自动化却被复杂的框架文档劝退?本文将以财务报告审批流程为例,带你从零掌握Flowable-Engine(工作流引擎)的核心功能,10分钟内完成第一个可运行的流程自动化项目。读完本文你将获得:

  • 用BPMN 2.0(业务流程模型和符号)设计可视化流程的能力
  • 快速搭建Flowable开发环境的实操步骤
  • 完整的流程部署与运行代码示例
  • 常见流程节点(用户任务、网关、定时器)的配置方法

什么是BPMN 2.0?

BPMN(Business Process Model and Notation,业务流程模型与符号)2.0是一套全球通用的流程建模标准,它通过直观的图形符号和严格的XML规范,让业务人员和技术人员能够无缝协作。Flowable-Engine作为轻量级高效的流程引擎,完美支持BPMN 2.0标准,可帮助开发者快速实现流程自动化。

官方文档对BPMN 2.0的定义:"BPMN是一种广泛接受和支持的用于表示流程的标准符号"BPMN介绍文档。简单来说,BPMN就像流程界的"施工图",而Flowable则是"施工队",二者结合可将业务流程图直接转化为可执行的程序。

环境准备与快速上手

开发环境要求

Flowable-Engine需要以下环境支持:

  • JDK 17+(必须,官方文档明确要求)环境要求
  • Maven/Gradle构建工具
  • 关系型数据库(H2、MySQL等,本文使用H2内存数据库)
  • 流程设计工具(可选,如Flowable Designer或在线设计器)

10分钟实现财务报告审批流程

我们以"月度财务报告审批"为例,构建一个包含"编写报告"和"审核报告"两个环节的流程。这个流程虽然简单,但包含了BPMN的核心元素:开始事件、用户任务和结束事件。

步骤1:创建BPMN流程文件

在项目资源目录下创建FinancialReportProcess.bpmn20.xml文件,内容如下:

<definitions
  xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
  xmlns:flowable="http://flowable.org/bpmn"
  targetNamespace="Examples">

  <process id="financialReport" name="月度财务报告审批流程">
    <!-- 开始事件 -->
    <startEvent id="theStart" />
    
    <!-- 顺序流:从开始事件到编写报告任务 -->
    <sequenceFlow id="flow1" sourceRef="theStart" targetRef="writeReportTask" />
    
    <!-- 编写报告任务(分配给财务组) -->
    <userTask id="writeReportTask" name="编写月度财务报告">
      <documentation>撰写月度财务报告并提交审核</documentation>
      <potentialOwner>
        <resourceAssignmentExpression>
          <formalExpression>accountancy</formalExpression>
        </resourceAssignmentExpression>
      </potentialOwner>
    </userTask>
    
    <!-- 顺序流:从编写任务到审核任务 -->
    <sequenceFlow id="flow2" sourceRef="writeReportTask" targetRef="verifyReportTask" />
    
    <!-- 审核报告任务(分配给管理层) -->
    <userTask id="verifyReportTask" name="审核月度财务报告">
      <documentation>审核财务报告并确认发布</documentation>
      <potentialOwner>
        <resourceAssignmentExpression>
          <formalExpression>management</formalExpression>
        </resourceAssignmentExpression>
      </potentialOwner>
    </userTask>
    
    <!-- 顺序流:从审核任务到结束事件 -->
    <sequenceFlow id="flow3" sourceRef="verifyReportTask" targetRef="theEnd" />
    
    <!-- 结束事件 -->
    <endEvent id="theEnd" />
  </process>
</definitions>

上述XML定义了一个包含两个用户任务的流程,其中accountancymanagement是用户组名称,对应实际系统中的角色分配。

步骤2:流程部署与运行代码

创建Java类FinancialReportWorkflow.java,通过Flowable API完成流程部署、启动和任务处理:

public class FinancialReportWorkflow {
  public static void main(String[] args) {
    // 1. 创建流程引擎(使用内存数据库)
    ProcessEngine engine = ProcessEngineConfiguration
      .createStandaloneInMemProcessEngineConfiguration()
      .buildProcessEngine();
    
    // 2. 获取服务实例
    RepositoryService repositoryService = engine.getRepositoryService();
    RuntimeService runtimeService = engine.getRuntimeService();
    TaskService taskService = engine.getTaskService();
    
    // 3. 部署流程定义
    Deployment deployment = repositoryService.createDeployment()
      .addClasspathResource("FinancialReportProcess.bpmn20.xml")
      .deploy();
    System.out.println("流程部署ID: " + deployment.getId());
    
    // 4. 启动流程实例
    ProcessInstance instance = runtimeService.startProcessInstanceByKey("financialReport");
    System.out.println("启动流程实例: " + instance.getId());
    
    // 5. 查询财务组任务并处理
    List<Task> tasks = taskService.createTaskQuery()
      .taskCandidateGroup("accountancy")
      .list();
    System.out.println("财务组待处理任务数: " + tasks.size());
    
    // 6. 申领并完成编写报告任务
    Task writeTask = tasks.get(0);
    taskService.claim(writeTask.getId(), "fozzie"); // 申领任务
    taskService.complete(writeTask.getId()); // 完成任务
    System.out.println("已完成任务: " + writeTask.getName());
    
    // 7. 管理层审核任务处理
    Task verifyTask = taskService.createTaskQuery()
      .taskCandidateGroup("management")
      .singleResult();
    taskService.claim(verifyTask.getId(), "kermit");
    taskService.complete(verifyTask.getId());
    System.out.println("已完成任务: " + verifyTask.getName());
    
    // 8. 验证流程是否结束
    HistoricProcessInstance historicInstance = engine.getHistoryService()
      .createHistoricProcessInstanceQuery()
      .processInstanceId(instance.getId())
      .singleResult();
    System.out.println("流程结束时间: " + historicInstance.getEndTime());
  }
}

BPMN核心元素可视化解析

基础流程结构

一个完整的BPMN流程包含以下核心元素,以我们的财务审批流程为例:

财务报告流程示例图

  • 开始事件(Start Event):流程的起点,图中左侧空心圆。在XML中通过<startEvent>定义,示例中ID为theStart
  • 用户任务(User Task):需要人工处理的环节,图中矩形节点。通过<userTask>定义,需指定处理人或组用户任务分配
  • 顺序流(Sequence Flow):连接各个节点的箭头,XML中通过<sequenceFlow>sourceReftargetRef指定流向。
  • 结束事件(End Event):流程的终点,图中右侧加粗边框圆,XML中通过<endEvent>定义。

常用流程控制元素

除基础元素外,Flowable还支持多种高级流程控制:

排他网关(Exclusive Gateway)

用于实现条件分支逻辑,如"审批通过/驳回"场景:

<exclusiveGateway id="decisionGateway" />
<sequenceFlow id="flow4" sourceRef="decisionGateway" targetRef="approvedTask">
  <conditionExpression xsi:type="tFormalExpression">${approved == true}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow5" sourceRef="decisionGateway" targetRef="rejectedTask">
  <conditionExpression xsi:type="tFormalExpression">${approved == false}</conditionExpression>
</sequenceFlow>

定时器事件(Timer Event)

可实现定时任务,如"3天后自动审批":

<boundaryEvent id="escalationTimer" attachedToRef="verifyReportTask">
  <timerEventDefinition>
    <timeDuration>P3D</timeDuration> <!-- 3天 -->
  </timerEventDefinition>
</boundaryEvent>

定时器支持三种时间格式定时器定义

  • timeDate:固定日期,如2023-12-31T23:59:59
  • timeDuration:持续时间,如P2D(2天)
  • timeCycle:循环周期,如R3/PT1H(每小时一次,共3次)

实际应用与扩展

与Spring Boot集成

在实际项目中,推荐使用Spring Boot Starter简化配置:

<dependency>
  <groupId>org.flowable</groupId>
  <artifactId>flowable-spring-boot-starter</artifactId>
  <version>最新版本</version>
</dependency>

配置文件application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/flowable?serverTimezone=UTC
    username: root
    password: root
flowable:
  process-definition-location-prefix: classpath:/processes/
  database-schema-update: true

流程监控与管理

Flowable提供了Web应用监控流程实例:

  • Flowable Task:任务管理界面
  • Flowable Modeler:在线流程设计器
  • Flowable Admin:流程管理控制台

这些工具可通过Docker快速部署,执行脚本后访问http://localhost:8080/flowable-task即可。

常见问题与解决方案

1. 流程定义ID与版本号

Flowable自动为流程定义生成ID,格式为key:version。当修改流程并重新部署时,版本号会自动递增流程定义ID规则。启动流程时推荐使用startProcessInstanceByKey方法,自动选择最新版本。

2. 任务分配与权限控制

除了示例中的组分配,还支持多种分配方式:

  • 指定用户:<formalExpression>kermit</formalExpression>
  • 表达式分配:<formalExpression>${assignee}</formalExpression>(assignee为流程变量)
  • 多用户候选:通过<candidateUsers>指定多个用户

3. 异步执行与事务

长时间运行的任务应配置为异步执行,避免阻塞流程:

<serviceTask id="longRunningTask" 
             flowable:async="true" 
             flowable:class="com.example.LongRunningService" />

下一步学习路径

本文示例只是BPMN功能的冰山一角,建议通过以下资源深入学习:

  1. 官方文档BPMN构造详细说明
  2. 高级功能:流程迁移Process Instance Migration、表单集成、事件注册表
  3. 示例项目Spring Boot集成示例

现在,你已经掌握了Flowable BPMN的核心技能!尝试修改本文的财务审批流程,添加"报告驳回"分支和"自动发送邮件"功能,体验流程自动化的强大魅力。如有疑问,可查阅Flowable官方论坛或提交Issue到项目仓库

提示:Flowable所有内部实现类位于.impl.包下,不建议直接使用这些类内部实现类说明。开发时应优先使用API接口,如RuntimeServiceTaskService等。

登录后查看全文
热门项目推荐
相关项目推荐