本文节选自《疯狂工作流讲义(第2版)》
京东购买地址:https://item.jd.com/12246565.html
工作流Activiti6电子书:http://blog.csdn.net/boxiong86/article/details/78488562
工作流Activiti6教学视频:http://blog.csdn.net/boxiong86/article/details/78608585
补偿中间事件
在11.5.4章节中,讲解了补偿边界事件的使用,在该小节的案例中,使用了补偿中间事件触发补偿边界事件,补偿中间事件主要用于触发当前所在执行流的全部补偿Catching事件(补偿边界事件),补偿中间事件是Throwing事件,每个补偿事件都需要有关联的处理者,当补偿事件触发时,会转给这些处理者处理补偿,本小节将讲解在使用补偿中间事件的各种特性。
补偿执行次数
当补偿中间事件被触发,会触发当前执行流的补偿Catching事件,如果一个附有补偿Catching事件的流程活动会执行多次(具有多实例的特性),那么在进行补偿时,补偿次数与流程活动的执行次数一样。BPMN2.0中允许多实例的流程活动,在一个流程中,一个流程活动(某些部分或者全部)可以被执行多次,现定义一个测试流程,如图11-16所示。
图11-16 测试补偿次数流程
图11-16表示一个简单的流程,流程首先会到达“正常工作”的ServiceTask,然后会到达“抛出错误”的ServiceTask,这个“抛出错误”的ServiceTask总会抛出错误,然后触发错误边界事件,然后流程会到达补偿中间事件,此时补偿中间事件会触发“正常工作”的补偿边界事件,补偿将会由“补偿工作”的ServiceTask执行,该流程对应的流程文件内容如代码清单11-37所示。
代码清单11-37:codes\11\11.7\compensation-times\resource\bpmn\CompensationTimes.bpmn
<process id="ctProcess" name="ctProcess">
<startEvent id="startevent1" name="Start"></startEvent>
<serviceTask id="servicetask1" name="正常工作"①
activiti:class="org.crazyit.activiti.RegularWork">
<multiInstanceLoopCharacteristics
isSequential="true">
<loopCardinality>3</loopCardinality>
</multiInstanceLoopCharacteristics>
</serviceTask>
<boundaryEvent id="boundarysignal1" cancelActivity="true"
attachedToRef="servicetask1">
<compensateEventDefinition></compensateEventDefinition>
</boundaryEvent>
<serviceTask id="servicetask2" name="抛出错误"②
activiti:class="org.crazyit.activiti.ThrowError"></serviceTask>
<boundaryEvent id="boundaryerror1" cancelActivity="true"
attachedToRef="servicetask2">
<errorEventDefinition></errorEventDefinition>
</boundaryEvent>
<intermediateThrowEvent id="signalintermediatethrowevent1"③
name="SignalThrowEvent">
<compensateEventDefinition></compensateEventDefinition>
</intermediateThrowEvent>