经过上文的介绍,我们已经使用 Flowable Modeler 创建出对应的BPMN流程,并需要导出该文件交由后端项目使用。操作步骤非常直观:
首先,在 Flowable UI 中点击 Flowable Modeler 应用,进入该界面后我们会看到所有已创建的流程模型。点击目标流程(如“员工请假流程”),在设计器界面的右上角找到并点击下载 (Download) 按钮,即可将流程定义保存为 .bpmn20.xml 文件。下载完成后,将此文件放置到后端 Spring Boot 项目的 src/main/resources/processes/ 目录下即可。
当我们将文件放入指定目录后,它究竟是如何被加载到数据库中去的呢?
理解这个过程,能帮助我们更深刻地掌握 Flowable 的基本架构。
要解开这个谜题,我们首先要记住一个核心概念:流程引擎 (Process Engine)。
核心概念:流程引擎 (Process Engine)
您可以将流程引擎想象成 Flowable 的“心脏”和“大脑”。它是一个功能强大的软件组件,负责:
解析与部署:读取 BPMN XML 文件,将其解析成内部可识别的数据结构,并持久化到数据库中。
流程实例管理:根据流程定义,创建和管理流程的每一个运行实例。
任务管理:创建、分配、查询和完成流程中的用户任务或系统任务。
状态持久化:跟踪每个流程实例的当前状态(例如,流程正停留在哪个节点),并将这些状态信息实时保存在数据库中。
提供服务接口:暴露一系列API(如 RepositoryService, RuntimeService, TaskService 等),让我们的业务代码可以与流程进行交互。
简而言之,所有关于流程的生命周期管理,都由流程引擎全权负责。
BPMN 自动部署的详细步骤
在 Spring Boot 环境中,flowable-spring-boot-starter 依赖为我们带来了极大的便利,它实现了一套完整的自动部署机制。当您的 Spring Boot 应用启动时,后台会悄然发生以下一系列事件:
第一步:应用启动与Flowable自动配置
当 Spring Boot 应用启动时,flowable-spring-boot-starter 中的自动配置类会被触发。它会自动创建并配置一个 ProcessEngine 实例以及所有相关的服务(RepositoryService, RuntimeService 等)。
第二步:资源扫描 (Resource Scanning)
流程引擎配置完成后,它会立即开始扫描预定位置的流程文件。默认情况下,这个位置就是 classpath:/processes/。它会查找所有以 .bpmn20.xml 或 .bpmn 结尾的文件。这正是我们将文件放入 src/main/resources/processes/ 目录的原因。
第三步:解析与验证 (Parsing & Validation)
流程引擎找到文件后,并不会简单地将其当作普通文件处理。它会:
XML解析:使用内置的 XML 解析器读取文件内容。
BPMN 规范验证:检查 XML 的结构是否符合 BPMN 2.0 规范。如果文件格式有误(例如标签未闭合、属性错误等),启动过程会在此处抛出异常并失败。
构建模型对象:如果验证通过,引擎会将 XML 中的元素(如用户任务、网关、顺序流等)转换成一系列内部的、结构化的 Java 对象模型(ProcessDefinition 对象)。
第四步:部署到数据库 (Deployment to Database)
这是最关键的一步。流程引擎通过其 RepositoryService 服务,执行一个部署 (Deployment) 操作。这个操作会将解析好的流程模型持久化到数据库的一系列表中,这些表通常以 ACT_ 作为前缀。
核心相关的表主要有:
ACT_RE_DEPLOYMENT: 每执行一次部署操作,就会在这张表中插入一条记录,代表一次部署行为。
ACT_RE_PROCDEF: 这张表存储着流程定义的核心信息。每个成功部署的BPMN文件都会在这里生成一条记录。关键字段包括 KEY_(流程ID,如 leaveRequestProcess)、NAME_(流程名称)、VERSION_(版本号)等。
ACT_GE_BYTEARRAY: 此表用于存储“二进制”数据。Flowable 会将原始的 .bpmn20.xml 文件内容以及自动生成的流程图图片(如有)存储在这里,并与 ACT_RE_PROCDEF 表关联。这样可以随时从数据库中取回原始定义文件。
流程版本控制:
值得一提的是,Flowable 内置了版本管理机制。如果您修改了 leave-process.bpmn20.xml 文件并重新启动应用,Flowable 会检测到这是一个已存在 KEY_ 的新版本流程。它不会覆盖旧版本,而是会创建一个新的流程定义记录,其 VERSION_ 字段会自动加 1。这确保了正在运行中的旧版本流程实例可以继续按照其原始定义执行,不受新部署的影响。
整个流程顺序图如下所示:
[开发者]
|
+--> 将 a.bpmn20.xml 放入 /resources/processes/
|
| (1. Spring Boot 应用启动)
v
[Flowable Auto-Configuration]
|
+--> (2. 扫描 classpath:/processes/)
|
v
[Process Engine]
|
+--> (3. 解析并验证 a.bpmn20.xml)
|
v
[RepositoryService.createDeployment()]
|
+--> (4. 将流程定义写入数据库)
|
+--> `ACT_RE_DEPLOYMENT` (记录本次部署)
+--> `ACT_RE_PROCDEF` (记录流程定义,版本 V1)
+--> `ACT_GE_BYTEARRAY` (存储XML文件内容)
那么我们该如何启动、推进和查询这个流程呢?
在 Spring Boot 应用中,这些服务接口已经由 flowable-spring-boot-starter 自动配置并注入到 Spring 容器中,我们只需要在需要的地方使用 @Autowired 即可直接使用。
首先,需要了解几个最核心的服务,它们是与流程引擎交互的入口:
RuntimeService 管理正在运行的流程实例和流程变量。 运行时服务:用于启动流程、查询流程实例、设置/获取流程变量。
TaskService 管理用户任务,如查询、认领、完成任务。 任务服务:所有与人工任务相关的操作都在这里。
RepositoryService 管理流程定义和部署。 仓库服务:用于查询流程定义、部署文件等静态资源。
HistoryService 查询所有历史数据,如已完成的流程和任务。 历史服务:用于流程审计、报表生成等。
IdentityService管理用户和用户组(Flowable内置的用户管理)。 身份服务:管理用户和组,但实际项目中常与自己的用户体系集成。
整体架构如图所示:

783

被折叠的 条评论
为什么被折叠?



