3. 事件详解:开始事件、中间事件、结束事件及其触发方式

事件是流程的 “脉搏”,它定义了流程在何时、因何而启动,以及在执行过程中发生了什么“意外”或“等待”。BPMN 2.0 将事件分为三大类(开始、中间、结束),并根据其触发方式(消息、定时、条件、信号、错误、补偿、链接、终止等)进一步细分。掌握事件是区分“流程图”与“可执行流程模型”的关键分水岭。

3.1 概念解释:事件的三大类别与触发方式

每个事件都可以视为流程中的一个“触发器”或“结果”。根据其在流程中的位置,可分为:

  • 开始事件:流程实例的起点,决定了流程如何被实例化。
  • 中间事件:发生在流程执行过程中,用于等待、捕获或抛出某种状态。
  • 结束事件:流程实例的终点,定义了流程结束时的最终行为。

事件内部的图标表示其触发语义。最常见的触发类型包括:

  • 消息 (Message):等待或发送一条消息。
  • 定时 (Timer):在特定时间点或时间周期后触发。
  • 条件 (Conditional):当某个业务规则或表达式变为真时触发。
  • 信号 (Signal):广播一个信号,可被流程内部或跨流程接收。
  • 错误 (Error):捕获或抛出已定义的业务错误。
  • 补偿 (Compensation):执行回滚操作。
  • 链接 (Link):同图内的跳转连接器。
  • 终止 (Terminate):立即结束所有分支。
核心区分:捕获 vs 抛出
中间事件分为“捕获型”(Catching,等待外部触发)和“抛出型”(Throwing,主动发起触发)。开始事件只能是捕获型;结束事件只能是抛出型。

3.2 流程拆解:事件的触发语义详解

以下拆解每个事件的触发逻辑,以及其在现实业务中的对应场景。

3.2.1 开始事件 (Start Event)

流程从这里开始。不同类型的开始事件决定了流程实例的创建方式:

  • 无事件 (None):默认无触发条件,流程通过手动启动或父流程调用。
  • 消息 (Message):收到某个特定消息(如订单提交、邮件到达)后启动。
  • 定时 (Timer):在指定时间(如“每天上午9点”)或延时后启动。
  • 条件 (Conditional):当某个业务数据满足条件(如“库存低于安全水位”)时启动。
  • 信号 (Signal):捕获由另一个流程或外部系统广播的信号。

3.2.2 中间事件 (Intermediate Event)

中间事件位于活动之间的流上。它不改变流程的整体结构,但会在该节点暂停或触发一个动作。

  • 捕获型 (Catching):流程执行到此处时暂停,等待事件发生(如等待客户确认、等待审批超时)。
  • 抛出型 (Throwing):流程执行到此处时主动发送事件(如发送消息给其他流程、抛出一个错误信号)。

3.2.3 结束事件 (End Event)

流程在此终结。不同的结束事件决定了流程结束时的行为结果:

  • 无事件 (None):流程正常结束,无副作用。
  • 消息 (Message):流程结束时,自动向外部发送一条消息。
  • 错误 (Error):流程异常终止,并抛出一个错误。
  • 终止 (Terminate):立即包含所有并行分支的运行,强制终止整个流程实例。
  • 补偿 (Compensation):结束流程时触发补偿活动。

3.3 案例分析:一个简单的库存补充流程

假设零售仓库的“自动补货流程”。通过该案例展示三种事件如何在同一个流程中协同工作。

步骤事件类型事件角色说明
1开始事件 (条件)启动当库存传感器检测到“库存 < 最小阈值”时,自动启动流程。
2中间事件 (定时)等待发送补货请求后,等待1小时用于管理层确认;超过时间自动升级。
3中间事件 (消息)捕获等待供应商的“订单确认消息”。
4结束事件 (消息)结束补货完成时,向财务系统发送“库存更新”消息。
5异常路径结束事件 (错误)若供应商拒绝确认,流程结束并抛出“采购失败”错误。
案例启示: 通过条件开始事件实现自动化触发,通过定时间事件实现超时处理,通过结束消息事件实现系统间集成。这是事件驱动流程的典型应用。

3.4 表格总结:事件类型与触发方式对照

类别 触发类型 图标语义 典型使用场景
开始事件消息信封收到客户订单、邮件请求时启动
定时时钟每日数据同步任务、定时报表生成
条件页面/数据库存水位低于阈值、市场指数突变
信号三角旗跨流程的全局告警通知
中间事件(捕获)定时时钟审批超时自动流转、等待特定日期
消息信封等待用户确认、接收第三方回复
条件页面/数据支付成功时触发下一节点
中间事件(抛出)消息信封(实心)流程中途发送提醒消息
信号三角旗(实心)广播“项目状态变更”给所有关联流程
结束事件消息信封流程结束时通知下游系统
错误闪电异常分支终止并记录错误日志
终止实心圆强制结束所有并行分支(如合规失败)

3.5 实践清单:事件建模检查要点

在模型中加入事件时,请对照以下清单进行自查:

  • 触发源确认: 明确该事件的触发源(人工、定时、系统消息还是信号广播)?
  • 生命周期: 事件位于流程的哪个位置(开始、中间还是结束)?语义是否匹配?
  • 边界事件: 中间事件是否可以附着在任务边界上用于处理异常或超时?(边界事件需要额外学习,但本章作为基础先了解概念)
  • 结束后果: 使用非“无事件”的结束事件时,明确其是否会产生副作用(如发送消息、抛出错误)?
  • 信号一致性: 抛出的信号名称与捕获的信号名称必须完全匹配,且全局唯一。
常见错误:混淆捕获型与抛出型中间事件。在流程的“等待”节点上使用了空心抛出的图标,导致模型语义变成了“主动发送”而非“被动等待”。务必确认图标内是否有填充色(捕获型通常为空心或线形图标,抛出型为实心图标)。

3.6 内联 SVG:事件分类与触发关系图

BPMN 事件三大类别与触发方式 开始事件 中间事件 结束事件 消息开始 定时开始 条件开始 信号开始 定时中间(捕获) 消息中间(捕获) 消息中间(抛出) 信号中间(抛出) 错误结束 消息结束 终止结束 说明 • 开始事件:捕类型(空心/线框图标),流程实例由此创建。 • 中间事件:分为捕类型(等待)和抛出型(主动发送);图标实心表示抛出。 • 结束事件:抛出型(实心/线框图标),流程实例在此终结。