# 消息事件
消息事件是工作流中用于实现流程与外部系统(或不同流程实例间)异步通信的机制,它通过特定名称的消息来触发流程的开始、等待、中断或发送通知。

# 事件类型
消息开始事件:流程的起点,通过接收一个特定名称的消息来启动整个流程实例。
消息中间捕获事件:流程会暂停在这个节点,直到收到指定的消息后才继续向下执行。
消息边界事件:像一个“监听器”附着在某个任务(如用户任务)上。它可以在任务执行过程中监听特定消息。它分为中断(消息到达后中断当前任务)和非中断(消息到达后,原任务继续执行,同时开启新路径)两种模式。
消息中间抛出事件:当流程执行到这里时,会主动“抛出”一条消息,通常用于通知外部系统。
消息结束事件:在流程结束时抛出一条消息,作为流程完成的信号或传递给其他系统。
# 工作原理和API
// 1. 通过消息名称和业务键关联消息,这可能会触发一个中间事件或启动一个新的流程实例
MessageCorrelationResult result = runtimeService.createMessageCorrelation("OrderReceivedMessage")
.processInstanceBusinessKey("ORDER-12345")
.setVariable("paymentMethod", "CreditCard")
.correlateWithResult();
// 2. 明确地通过消息启动一个流程实例
ProcessInstance instance = runtimeService.startProcessInstanceByMessage("OrderReceivedMessage");
// 3. 明确地触发一个已存在的流程实例中的消息中间事件
runtimeService.messageEventReceived("PaymentConfirmationMessage", executionId);
消息被触发后,引擎会找到匹配的流程定义(通过消息名称),然后要么创建一个新的流程实例(对于开始事件),要么让一个等待中的流程实例继续执行(对于中间捕获事件) 。所有这些正在进行中的消息订阅都可以通过查询 EventSubscription来查看。
# 最佳实践
1. 消息名称唯一性:在同一流程定义中,消息开始事件的名称必须是唯一的。在所有已部署的流程定义中,消息开始事件的名称也最好保持唯一,以避免混淆。
2. 利用业务键:在关联消息时,使用processInstanceBusinessKey(例如订单号、客户ID),这样可以精准地将消息关联到特定的流程实例,是实现流程交互和查询的关键。
3. 区分中断与非中断边界事件
中断边界事件:适用于发生后当前任务必须终止的情况。例如,用户在审批过程中取消了订单,那么审批任务本身就应该被中断,转而执行取消逻辑。
非中断边界事件:适用于发生后当前任务仍需继续的情况。例如,在审批任务期间,只是需要发送一个提醒通知,但并不中断审批任务本身。
4. 典型应用场景
异步流程启动:消息开始事件非常适合由外部系统事件触发的流程,比如“新订单到达”、“客户提交表单”。
流程间同步:消息中间捕获事件可用于等待另一个流程或外部系统的响应,比如“等待支付网关确认”。
异常或取消处理:中断消息边界事件常用于处理任务执行过程中的意外事件,如“订单取消”。