中间抛出事件

本文中内容和案例节选自贺波老师的《深入Activiti流程引擎:核心原理与高阶实战》一书。这本书中的内容更为全面、详尽,对系统学习和深入掌握Activiti/Flowable的用法非常有帮助,推荐给大家。

QQ交流群1:633168411 已满
QQ交流群2: 582010059

参照本书录制的讲解视频地址

博客地址

在开始事件和结束事件之间发生的事件都称为中间事件,BPMN2.0 规范中所指的中间事件也 包括边界事件,但本节中所介绍的中间事件是指可以单独作为流程元素的事件,即直接出现在流程 连线上的中间事件,这类事件即可以捕获触发器又可以抛出结果。中间事件会影响流程的流转路线, 但不会启动或直接终止流程的执行。

Flowable中间抛出事件分一下几类:

  • 空中间抛出事件
  • 信号中间抛出事件
  • 消息中间抛出事件
  • 补偿中间抛出事件
  • 升级中间抛出事件

空中间抛出事件

定义

空中间抛出事件是一个 Throwing 事件,在 intermediateThrowEvent 元素下不加入任何的事件定 义元素,就构成一个空中间抛出事件。它通常用于表示流程中的某个状态,在实际使用的过程中可 以通过添加执行监听器,来表示流程状态的改变。

图形标记

中间信号抛出事件显示为普通中间事件,内部无填充,如下图所示:

XML内容

  <process id="noneIntermediateThrowingEventProcess">
      <intermediateThrowEvent id="noneEvent">
      <extensionElements>
      <flowable:executionListener 
     class="com.dragon.flow.test.bpmn.event.IntermediateNoneEventTest$MyExecutionListe
     ner" event="start" />
      </extensionElements>
     </intermediateThrowEvent>
  </process>

在以上 xml 代码片段中,加粗的部分定义了 intermediateThrowEvent,在其 extensionElements 子元素中指定了一个流程监听器,

使用示例

演示demo

空中间抛出事件

信号中间抛出事件

定义

当流程执行到达信号抛出事件时,流程引擎会直接抛出信号,其他引用了与其相同的信号捕获 事件会被触发,信号发出后事件结束,流程沿后继路线继续执行。其抛出的信号可以被信号开始事 件(Signal Start Event)、信号中间捕获事件(Signal Intermediate Catch Event)、信号边界事件(Signal Boundary Interrputing Event)订阅处理。

图形标记

中间信号抛出事件显示为普通中间事件(圆圈套圆圈),内部又一个信号小图标。信号图标是 黑色的(有填充),表示抛出语义,如下图所示:

XML内容

信号中间抛出事件定义为标准中间触发事件,指定类型的子元素是 signalEventDefinition 元素:

 <signal id="theSignal" name="The Signal" />
 <process id="signalIntermediateThrowingEventProcess">
     <intermediateThrowEvent id="signal">
        <signalEventDefinition signalRef="theSignal" flowable:async="false"/>
     </intermediateThrowEvent>
 </process>

操作界面

演示demo

信号中间抛出事件

消息中间抛出事件

定义

消息中间事件指在流程中将一个消息事件作为独立的节点来运行。它是一种抛出事件,当流程 执行到消息中间事件时就会中断在这里,一直等待被触发,直接到该事件接收到相应的消息后,流 程沿后继路线继续执行。消息事件是一种引用了消息定义的事件,与信号事件不同的是,消息只能指向一个接收对象,不能像信号事件一样全局广播。

图形标记

消息中间事件显示为普通中间事件(圆圈套圆圈),内部是一个消息小图标。消息图标是白色 的(有填充),表示捕获语义,如图所示:

XML内容

消息中间事件定义为标准中间抛出事件,指定类型的子元素是 messageEventDefinition 元素:

<message id="message002" name="消息名称002" />
<intermediateThrowEvent id="Event_11007jw">
  <messageEventDefinition messageRef="message002" />
</intermediateThrowEvent>

在以上 xml 代码片段中,加粗的部分分别定义了 message 和 intermediateThrowEvent,消息 message的id属性值为message002,消息中间抛出事件intermediateThrowEvent中的 messageEventDefinition 子元素通过设置 messageRef 为 message002 引用了该消息。

操作界面

演示demo

消息中间抛出事件

补偿中间抛出事件

定义

补偿中间抛出事件用于触发一个补偿,当执行到达补偿中间抛出事件时触发该流程已完成活动 的边界补偿事件(Compensate Boundary Interrputing Event),完成补偿操作后自动执行后继路线。

图形标记

补偿中间抛出事件显示为普通中间事件(内部有小圈的圆),内部是一个补偿小图标。补偿图 标是黑色的(有填充),表示抛出语义,如下图所示:

XML内容

补偿中间抛出事件的 XML 内容是普通的中间抛出事件,包含一个 compensateEventDefinition 子元素:

 <process id="intermediateThrowEventProcess">
     <intermediateThrowEvent id="intermediateCompensation" name="中间补偿事件">
        <compensateEventDefinition />
     </intermediateThrowEvent>
 </process>

使用示例

补偿中间事件主要用来触发补偿,它可以针对指定活动或包含补偿事件的作用域触发补偿,通 过执行与活动相关联的补偿处理器的 execution 来执行补偿。补偿遵循以下特点:

  1. 如果对某项活动进行补偿,则相关的补偿处理器执行的次数与活动成功完成的次数相同。
  2. 如果对当前作用域进行补偿,则对当前作用域内的所有活动进行补偿,包括并行分支上的活动。
  3. 补偿是分级触发的:如果要补偿的活动是子流程,则为子流程中包含的所有活动触发补偿。 如果这个子流程有嵌套的活动,补偿会递归触发,但是补偿不会传播到比这个流程高的层级。如果 补偿在子流程中触发,不会传播到该子流程作用域外的活动上。BPMN 规范规定,对于“同一级别 的子流程”的活动,才触发补偿。
  4. Flowable 的补偿执行次序与流程执行顺序相反,这意味着最后完成的活动会最先执行补偿,依此类推。
  5. 中间补偿事件可以用来补偿已经完成的事务性子流程。
  6. 多实例活动抛出补偿时,只有当所有的实例都结束了相关的补偿处理器才会执行。这意味着多实例活动在被补偿前必须先被结束掉。

注意

如果补偿被一个包含子流程的作用域触发,子流程还包含了关联补偿处理器的节点, 如果它已经成功完成了,补偿只会传播到子流程 如果子流程中的节点也完成了,并关联了补偿处理器,如果子流程包含的这些节点还没有完成,就不会执行补偿处理器

演示demo

补偿中间抛出事件

升级中间抛出事件

敬请期待