3. 事件详解:开始事件、中间事件、结束事件及其触发方式
事件是流程的 “脉搏”,它定义了流程在何时、因何而启动,以及在执行过程中发生了什么“意外”或“等待”。BPMN 2.0 将事件分为三大类(开始、中间、结束),并根据其触发方式(消息、定时、条件、信号、错误、补偿、链接、终止等)进一步细分。掌握事件是区分“流程图”与“可执行流程模型”的关键分水岭。
3.1 概念解释:事件的三大类别与触发方式
每个事件都可以视为流程中的一个“触发器”或“结果”。根据其在流程中的位置,可分为:
- 开始事件:流程实例的起点,决定了流程如何被实例化。
- 中间事件:发生在流程执行过程中,用于等待、捕获或抛出某种状态。
- 结束事件:流程实例的终点,定义了流程结束时的最终行为。
事件内部的图标表示其触发语义。最常见的触发类型包括:
- 消息 (Message):等待或发送一条消息。
- 定时 (Timer):在特定时间点或时间周期后触发。
- 条件 (Conditional):当某个业务规则或表达式变为真时触发。
- 信号 (Signal):广播一个信号,可被流程内部或跨流程接收。
- 错误 (Error):捕获或抛出已定义的业务错误。
- 补偿 (Compensation):执行回滚操作。
- 链接 (Link):同图内的跳转连接器。
- 终止 (Terminate):立即结束所有分支。
核心区分:捕获 vs 抛出
中间事件分为“捕获型”(Catching,等待外部触发)和“抛出型”(Throwing,主动发起触发)。开始事件只能是捕获型;结束事件只能是抛出型。
中间事件分为“捕获型”(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 实践清单:事件建模检查要点
在模型中加入事件时,请对照以下清单进行自查:
- 触发源确认: 明确该事件的触发源(人工、定时、系统消息还是信号广播)?
- 生命周期: 事件位于流程的哪个位置(开始、中间还是结束)?语义是否匹配?
- 边界事件: 中间事件是否可以附着在任务边界上用于处理异常或超时?(边界事件需要额外学习,但本章作为基础先了解概念)
- 结束后果: 使用非“无事件”的结束事件时,明确其是否会产生副作用(如发送消息、抛出错误)?
- 信号一致性: 抛出的信号名称与捕获的信号名称必须完全匹配,且全局唯一。
常见错误:混淆捕获型与抛出型中间事件。在流程的“等待”节点上使用了空心抛出的图标,导致模型语义变成了“主动发送”而非“被动等待”。务必确认图标内是否有填充色(捕获型通常为空心或线形图标,抛出型为实心图标)。