跳转到内容

核心运行时概念


当你点击“启动一个流程”时,流程引擎内部并不是简单地“执行一张图”,而是在后台生成了一整套可以追踪、控制、恢复的运行实例。换句话说,BPMN 图只是“定义”,而引擎运行的,是“实例”。要理解流程引擎真正如何工作,我们必须先掌握几个最重要的运行时核心概念。

流程定义是流程引擎的“蓝图”,相当于建筑图纸。它描述了一个业务流程的结构、顺序和规则,是在建模阶段通过 BPMN 图创建的静态模型。

每个流程定义都包含多个节点(如开始、任务、网关、结束)以及这些节点之间的连线。
在 Flowable 或 Camunda 中,这类文件通常以 .bpmn 结尾,比如:

leave-request.bpmn

当你把这张流程图部署到引擎里,系统会为它生成一个流程定义 ID(processDefinitionId),并记录版本号。
这意味着——每次你修改并重新部署流程图时,系统会自动生成一个新的版本,旧版本仍然保留,方便历史流程继续运行。

可以简单地理解为:

流程定义是“模板”,流程实例是“模板被执行的一次具体应用”。

流程实例是流程定义的一个实际运行副本。
当你启动一个流程时,引擎会基于流程定义创建出一个独立的流程实例,这个实例包含当前节点、运行状态、执行人、变量值等信息。

例如,一个请假流程定义可以被不同员工多次启动:

  • 张三请假 → 实例 #1

  • 李四请假 → 实例 #2

  • 王五请假 → 实例 #3

它们都遵循同一个流程图,但每个实例的审批人、状态、结果可能不同。

引擎会为每个实例生成唯一的 processInstanceId,你可以通过它查询流程的当前状态、审批历史等信息。
在数据库层面,这些实例信息通常存放在诸如 act_ru_execution(运行中)和 act_hi_procinst(历史)等表中。

在流程实例内部,引擎使用“执行流(Execution)”来表示流程当前走到了哪一步。
你可以把它理解为引擎内部的“指针”,它指向当前正在运行的节点。

当流程经过一个顺序流时,这个指针就会移动到下一个节点。
如果流程进入并行网关,执行流会被复制成多个子指针,分别进入不同的分支;而当分支汇合时,这些指针会重新汇聚。

这个机制保证了引擎可以正确地处理复杂的分支与汇聚逻辑,也让流程能够支持并行审批、子流程、条件判断等多种运行模式。

任务是流程中最直接与人或系统交互的部分,也是运行时最核心的概念之一。
在 BPMN 中,一个任务节点(Task)可能代表不同的类型:

  • 用户任务(User Task):需要人工操作,如审批、签字、填写表单。

  • 服务任务(Service Task):由系统自动执行的任务,例如发送邮件、调用接口。

  • 脚本任务(Script Task):在流程中执行一段脚本逻辑。

  • 接收任务(Receive Task):等待某个外部信号后再继续执行。

对于开发者来说,用户任务最常见。当流程到达用户任务节点时,引擎会在数据库中创建一条任务记录(task),标明当前由谁负责审批。审批人完成任务后,调用 complete() 方法,引擎会自动推动流程进入下一个节点。

每个任务都有自己的 taskIdassignee(签收人)createTime(创建时间) 等属性,用于记录和追踪。

流程变量是流程执行时保存的动态数据。
它相当于在流程运行期间的“上下文环境”,用于在不同节点之间传递信息。

举个例子:
当员工发起请假申请时,可以设置一个变量 days = 5
后续的审批网关可以根据 days 的值判断是否需要进入“经理审批”环节。

流程变量的作用范围可以是:

  • 全局变量(整个流程实例可见)

  • 局部变量(仅在当前任务或子流程中可见)

这些变量既可以是简单的字符串、数字,也可以是复杂的对象,引擎会自动将它们序列化存储到数据库中。

活动(Activity) 是流程中的一个执行节点,可以是任务节点、子流程、事件节点等。
当流程运行到某个节点时,引擎会创建一个“活动实例(Activity Instance)”来表示这个节点的执行状态。

活动实例的状态变化反映了流程的真实执行轨迹:
创建、开始、完成、终止……这些信息被记录在历史表中,用于后续审计或回溯。

因此,当你在流程监控页面看到“当前流程执行到:部门经理审批”时,实际上就是通过活动实例表里的状态计算得出的。

一个流程实例从启动到结束,大致会经历以下几个阶段:

  1. 创建(Created):流程实例刚被启动。

  2. 运行中(Running):流程正在推进,执行流处于某个节点。

  3. 暂停(Suspended):流程被暂时挂起,等待外部条件。

  4. 完成(Completed):所有节点执行完毕,流程结束。

  5. 终止(Terminated):被管理员强制中止或异常终止。

流程引擎会自动维护这些状态,开发者可以通过 API 查询流程实例的生命周期信息。

为了保证流程的可追溯性,引擎会在流程执行的每个关键节点自动记录日志,包括:

  • 谁发起了流程;

  • 哪些人审批过;

  • 每个任务的开始与完成时间;

  • 使用了哪些变量;

  • 最终结果是什么。

这些历史数据通常保存在以 act_hi_ 开头的表中,是企业审计和流程分析的重要依据。
通过这些数据,我们可以轻松回答“某个请假单现在审批到哪了?”、“谁卡在中间没批?”、“平均审批耗时是多少?”等问题。

9. 运行时数据与历史数据的区别

Section titled “9. 运行时数据与历史数据的区别”

理解运行时与历史的区别非常重要:

类型说明存储表前缀是否实时更新
运行时数据当前正在执行的流程信息act_ru_
历史数据已完成或归档的流程记录act_hi_否(只读)

当一个流程执行完毕后,引擎会自动将相关运行数据转移到历史表中,以便释放系统资源,同时保留完整的执行轨迹。

流程引擎的运行就像一部复杂的机器,而这些核心概念正是它的齿轮与链条。
流程定义是图纸,流程实例是图纸的执行版本;
执行流是内部指针,控制着流程的前进;
任务让人和系统参与其中;
变量则是让流程具备逻辑判断与数据传递能力;
活动与历史数据让整个流程可见、可查、可回溯。

只有真正理解了这些概念,后续在使用 Flowable 或 Camunda 时,你才能读懂引擎日志、看懂数据库表结构,也能在代码中灵活地操作流程的启动、推进、挂起、终止与查询。