在 Flowable(以及其遵循的 BPMN 2.0 规范)中,事件是流程模型的核心组成部分。它表示在流程执行过程中发生的事情。事件不是一个“任务”或“活动”,它更像是一个触发器或一个信号,它能启动流程、结束流程、改变流程路径或对外部刺激做出反应。
理解事件的关键在于,它们代表了业务流程中那些“等待”和“响应”的时刻。
一、 事件的分类
Flowable 的事件可以从两个维度进行分类:
1. 按在流程中的位置分类:
开始事件 (Start Event):
图标:一个细单线圆圈。
作用:标志着流程的起点。每个流程(或子流程)都必须有一个开始事件。
例子:一个空的开始事件表示流程由用户或 API 手动启动。
结束事件 (End Event):
图标:一个粗单线圆圈。
作用:标志着流程中某一个路径的终点。当所有并行路径都到达结束事件时,整个流程实例才会结束。
特例:终止结束事件 (Terminate End Event),它会立即终止整个流程实例,包括所有并行的路径。
中间事件 (Intermediate Event):
图标:一个双线圆圈。
作用:发生在流程执行过程中的事件。它可以用来表示延迟、等待外部触发、或者抛出一个信号给其他流程。它分为两种:
捕获 (Catching):等待某个触发器。流程会在此处暂停,直到事件被触发。例如,等待一封邮件。
抛出 (Throwing):主动触发一个事件。流程执行到这里时,会立即抛出一个信号,然后继续执行。例如,发送一个通知。
边界事件 (Boundary Event):
图标:一个附着在活动(如用户任务)边框上的双线圆圈。
作用:它附着在一个活动上,相当于为这个活动设置了一个“监听器”。当活动正在执行时,如果边界事件被触发,它会中断当前活动(默认是中断型),并沿着边界事件引出的路径继续执行。
类型:分为中断型 (Interrupting) 和 非中断型 (Non-interrupting)。非中断型事件触发后,原活动会继续执行,同时会创建一个新的并行分支。
二、 按触发器类型分类(核心内容)
这是事件最有价值的部分,它定义了事件“为什么”会发生。以下是几种最常见的事件类型,它们可以应用于开始、中间和边界事件。
1. 定时器事件 (Timer Event)
图标:圆圈内有一个时钟。
作用:基于时间触发。
场景:
定时启动流程:使用定时器开始事件,例如“每天早上9点自动生成日报流程”。
任务超时处理:在用户任务上附加一个定时器边界事件。例如,“如果审批任务超过3天未处理,则自动升级给经理”。
流程延迟:使用中间捕获定时器事件。例如,“付款后,等待24小时再继续发货流程”。
配置:可以配置为特定日期 (timeDate)、时间段 (timeDuration) 或 Cron 表达式 (timeCycle)。
2. 消息事件 (Message Event)
图标:圆圈内有一个信封。
作用:基于一个具名的“消息”进行点对点通信。它总是针对一个特定的流程实例。
场景:
通过消息启动流程:当外部系统(如 Kafka、MQ)发送一个特定名称的消息时,启动一个新的流程实例。例如,“收到‘新订单’消息后,启动订单处理流程”。
流程间通信:一个流程(抛出消息)可以触发另一个正在等待该消息(捕获消息)的流程继续执行。例如,订单流程在发货后,抛出“已发货”消息,库存流程接收到后更新库存状态。
关键:通过消息名称和关联 ID(Correlation Key)来精确匹配到唯一的流程实例。
3. 信号事件 (Signal Event)
图标:圆圈内有一个三角形。
作用:与消息类似,但它是广播机制。一个信号被抛出后,所有订阅了该信号的活动都会被触发。
场景:
全局通知:一个管理员流程抛出一个“系统维护”信号,所有正在运行的订单流程都暂停执行。
触发多个流程:当“季度结束”信号发出时,多个不同的报表生成流程同时被触发。
与消息的区别:
消息:一对一,像打电话。
信号:一对多,像广播。
4. 错误事件 (Error Event)
图标:圆圈内有一个闪电符号。
作用:用于处理业务流程中可预见的业务异常。它不是技术异常(如 NullPointerException),而是业务层面的错误。
场景:
子流程错误处理:在一个“支付”子流程中,如果发生“余额不足”的业务错误,可以抛出一个错误事件。主流程可以捕获这个错误(通过错误边界事件或错误开始事件),然后转向“通知用户充值”的路径。
结束流程:错误结束事件会抛出错误,并期望上层流程(调用它的父流程)来捕获和处理。
5. 升级事件 (Escalation Event)
图标:圆圈内有一个向上的箭头。
作用:类似于错误事件,但通常是非中断的。它用于将一个情况“升级”到更高的处理级别,而原始活动可能仍在继续。
场景:
“客户投诉处理”任务如果在24小时内未完成,会触发一个升级边界事件,该事件会创建一个“通知主管”的任务,但原来的“客户投诉处理”任务依然存在,可以继续处理。
6. 补偿事件 (Compensation Event)
图标:圆圈内有两个向左的三角箭头。
作用:用于执行业务层面的“回滚”或“撤销”操作。它只能触发那些已经成功完成的、并被标记为可补偿的活动。
场景:
一个旅行预订流程,成功完成了“预订机票”和“预订酒店”两个活动。但在最后的“支付”环节失败了。此时,可以触发一个补偿事件,该事件会反向触发与“预订机票”和“预订酒店”关联的补偿活动,即“取消机票”和“取消酒店”。
7. 条件事件 (Conditional Event)
图标:圆圈内有一个文档线条符号。
作用:当一个预设的条件(通常是基于流程变量的表达式)变为 true 时触发。
场景:
一个流程需要等待多个前置条件满足才能继续。例如,只有当流程变量 paymentReceived 为 true 并且 stockAvailable 为 true 时,流程才从条件事件处继续。
三、 开发人员如何监听引擎事件
除了在 BPMN 模型中定义事件外,Flowable 引擎自身在执行过程中也会产生各种生命周期事件。开发人员可以通过监听这些事件来实现日志记录、审计、自定义通知、系统集成等功能。
这通过实现 FlowableEventListener 接口来完成。
- 可监听的事件类型(FlowableEngineEventType):
Flowable 提供了非常丰富的事件类型,例如:
PROCESS_STARTED, PROCESS_COMPLETED, PROCESS_CANCELLED
ACTIVITY_STARTED, ACTIVITY_COMPLETED
TASK_CREATED, TASK_ASSIGNED, TASK_COMPLETED
VARIABLE_CREATED, VARIABLE_UPDATED, VARIABLE_DELETED
JOB_EXECUTION_SUCCESS, JOB_EXECUTION_FAILURE
后续将对事件进行逐一的讲解,目前只是简述一下。