Flowable流程引擎核心概念和入门

Flowable 是一款超级强劲的开源业务流程管理(BPM)和工作流引擎,用于设计、执行和监控自动化业务流程。下面这个表格汇总了它的核心构成,帮你快速建立整体认知。

核心维度

关键概念/组件

核心职责与价值

架构核心

流程引擎 (ProcessEngine)

所有操作的总入口,通过它获取各种服务,是引擎的“大脑”和“指挥中心”。

数据抽象

流程定义 (Process Definition)

业务流程的“设计图”或“蓝图”,一般是一个BPMN 2.0格式的XML文件,定义了流程的结构、节点和流转规则。

流程实例 (Process Instance)

流程定义的一次具体运行。例如,一个“请假流程定义”可以被启动多次,产生多个不同的“请假流程实例”。

运行时服务

RepositoryService

负责流程定义的部署、查询和删除等管理操作,相当于“图纸管理员”。

RuntimeService

负责启动流程实例、管理运行时的流程实例和设置流程变量,是流程的“启动按钮”和“运行控制器”。

TaskService

管理“用户任务”,例如查询某个用户待办的任务、完成任务等,是与人交互最频繁的服务。

HistoryService

查询所有已经执行完毕的历史数据,用于生成报表和监控分析。

数据持久化

数据库表 (ACT_)*

引擎运行状态和历史数据的持久化存储,表名以 ACT_开头,后跟两位字母表明用途(如 ACT_RE_*表明存储库表,ACT_RU_*表明运行时表等)。


快速入门指南

我们通过一个经典的“请假审批”流程,来实际体验如何使用 Flowable。

1. 环境准备与依赖引入

第一,在一个 Spring Boot 项目中,通过 Maven 引入 Flowable 相关依赖。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 核心依赖 -->
    <dependency>
        <groupId>org.flowable</groupId>
        <artifactId>flowable-spring-boot-starter</artifactId>
        <version>6.8.0</version> 
    </dependency>
    <!-- 数据库驱动,以H2内存数据库为例 -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

引入依赖后,Flowable 在应用启动时会自动创建所需的数据库表

2. 设计流程定义(BPMN 2.0)


src/main/resources/processes/下创建 leave-request.bpmn20.xml文件。这个 XML 文件定义了一个简单的请假流程:员工申请 → 经理审批 → 结束。

<?xml version="1.0" encoding="UTF-8"?>
<definitions ...>
    <process id="leave-process" name="请假流程" isExecutable="true">
        <!-- 1. 开始事件 -->
        <startEvent id="start"/>
        <!-- 2. 员工申请任务 -->
        <userTask id="employeeApplyTask" name="提交请假申请" flowable:assignee="#{employee}"/>
        <!-- 3. 经理审批任务 -->
        <userTask id="managerApproveTask" name="经理审批" flowable:candidateGroups="managers"/>
        <!-- 4. 排他网关,根据经理的审批意见决定流程走向 -->
        <exclusiveGateway id="decisionGateway"/>
        <!-- 5. 批准路径:系统存档(自动任务) -->
        <serviceTask id="archiveTask" name="归档申请" flowable:class="org.example.ArchiveService"/>
        <!-- 6. 拒绝路径:发送通知(自动任务) -->
        <serviceTask id="sendRejectionTask" name="发送拒绝通知" flowable:class="org.example.SendRejectionService"/>
        <!-- 7. 结束事件 -->
        <endEvent id="end"/>
        <!-- 连接线 -->
        <sequenceFlow sourceRef="start" targetRef="employeeApplyTask"/>
        <sequenceFlow sourceRef="employeeApplyTask" targetRef="managerApproveTask"/>
        <sequenceFlow sourceRef="managerApproveTask" targetRef="decisionGateway"/>
        <sequenceFlow sourceRef="decisionGateway" targetRef="archiveTask">
            <conditionExpression xsi:type="tFormalExpression">${approved == true}</conditionExpression>
        </sequenceFlow>
        <sequenceFlow sourceRef="decisionGateway" targetRef="sendRejectionTask">
            <conditionExpression xsi:type="tFormalExpression">${approved == false}</conditionExpression>
        </sequenceFlow>
        <sequenceFlow sourceRef="archiveTask" targetRef="end"/>
        <sequenceFlow sourceRef="sendRejectionTask" targetRef="end"/>
    </process>
</definitions>

代码关键点解读

  • isExecutable=”true”:声明该流程是可执行的。
  • userTask:需要人工处理的任务。assignee指定具体处理人,candidateGroups指定候选用户组。
  • exclusiveGateway:排他网关,根据条件表达式 conditionExpression决定流程走向。这里的 approved是一个流程变量。
  • serviceTask:系统自动执行的任务,通过 class属性关联到自定义的Java类。

3. 部署流程定义

使用 RepositoryService将设计好的BPMN文件部署到引擎中。

@Autowired
private RepositoryService repositoryService;

public void deployProcess() {
    Deployment deployment = repositoryService.createDeployment()
        .addClasspathResource("processes/leave-request.bpmn20.xml")
        .name("请假流程部署")
        .deploy(); // 执行部署
    System.out.println("流程部署成功,部署ID: " + deployment.getId());
}

部署成功后,流程定义信息会被存入 ACT_RE_PROCDEF等表中。

4. 启动流程实例

流程定义部署后,就可以使用 RuntimeService根据其唯一Key(即BPMN中 process标签的 id属性)来启动一个具体的流程实例了。

@Autowired
private RuntimeService runtimeService;

public void startProcessInstance() {
    // 设置流程变量
    Map<String, Object> variables = new HashMap<>();
    variables.put("employee", "zhangsan"); // 设置申请人
    variables.put("leaveDays", 3); // 设置请假天数

    // 根据流程定义的Key启动实例
    ProcessInstance instance = runtimeService.startProcessInstanceByKey("leave-process", variables);
    System.out.println("流程实例启动成功,实例ID: " + instance.getId());
}

5. 查询与处理任务

在实际应用中,员工“张三”登录系统后,需要查询并处理他的待办任务。这是通过 TaskService完成的。

@Autowired
private TaskService taskService;

// 1. 查询用户的待办任务
public List<Task> getTasks(String assignee) {
    return taskService.createTaskQuery().taskAssignee(assignee).list();
}

// 2. 完成任务,并设置审批结果(approved)这个流程变量
public void completeTask(String taskId, boolean isApproved) {
    Map<String, Object> taskVariables = new HashMap<>();
    taskVariables.put("approved", isApproved);
    taskService.complete(taskId, taskVariables); // 完成任务并推进流程
    System.out.println("任务处理完成");
}

6. 历史数据查询

流程实例结束后,可以通过 HistoryService来查询历史记录,用于生成报表或审计。

@Autowired
private HistoryService historyService;

public void getHistoricProcessInstances() {
    List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery()
        .processDefinitionKey("leave-process")
        .finished() // 查询已结束的实例
        .list();
    // 处理查询结果...
}

核心进阶特性

当基本流程跑通后,以下高级特性可以协助你构建更复杂、更智能的应用。

  1. 流程变量 (Process Variables)
  2. 流程变量是流程实例的“状态”或“记忆”,用于在流程的不同节点间传递数据(如请假天数、审批意见)。它们以键值对的形式存储,并支持复杂对象。
  3. 任务分配策略
  4. Flowable 提供了灵活的任务分配方式:
  5. 固定分配:在BPMN中写死 assignee=”zhangsan”。
  6. 表达式分配:动态指定,如 assignee=”#{applicant}”,其中 applicant是流程变量。
  7. 候选组/人:candidateGroups=”managers”,允许一个组内的任何用户认领并处理该任务。
  8. 监听器 (Listeners)
  9. 你可以在流程执行的关键点(如任务创建、完成,流程启动、结束)上挂载监听器,执行自定义逻辑(如发送邮件通知、记录日志),实现业务逻辑的解耦。

总结

总而言之,Flowable 的核心价值在于它将复杂的业务流程可视化、可执行、可监控。通过将业务逻辑从代码中抽离出来,用标准化的BPMN图形进行描述和管理,极大地提高了流程的灵活性可维护性

希望这份指南能协助你清晰地理解 Flowable 并成功迈出第一步。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
欧阳潼舢的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容