camunda之——取消和补偿事件(Cancel and Compensation Events)

取消事件(Cancel Events):

一、取消结束事件(Cancel End Event):

       取消结束事件只能与事务子流程配合使用。当流程到达取消结束事件,一个取消事件将会被抛出,这个取消事件必须被一个取消边界事件捕获。这取消边界事件随后会取消这个事务并触发补偿。

二、取消边界事件(Cancel Boundary Event):

       依附于事务子流程的上的中间捕获取消边界事件,或者简称取消边界事件。当一个事务被取消时,取消边界事件将会被触发。当取消边界事件被触发后,它首先打断在这个作用域下的所有活动的执行。接下来,它会开始执行补偿所有在这个事务的作用域内的活动的补偿边界事件。补偿行为是同步的,就是说边界事件会一直等待到补偿事件完成后才会离开事务。即当补偿完成后,这个事务子流程会离开取消边界事件。

注意:
       1.一个事务子流程只允许有一个取消边界事件
       2.如果事务子流程有嵌套的子流程,只有那些子流程已经完全成功的子流程才会触发补偿
       3.如果取消边界事件放置在多个流程实例的事务子流程上,如果一个实例触发取消,所有的实例都会取消。

       一个典型的边界事件的定义:

<boundaryEvent id="boundary" attachedToRef="transaction" >
  <cancelEventDefinition />
</boundaryEvent>

       因为取消边界事件总是可中断的,所以不需要cancelActivity属性

补偿事件(Compensation Events):

一、中间抛出补偿事件(Intermediate Throwing Compensation Event):

       中间抛出补偿事件用于触发一个补偿:

触发补偿:补偿事件可以被指定的活动触发,或者一个拥有补偿事件的作用域触发。补偿的执行是通过一个活动的补偿handler的execution来执行补偿
       1.当为某个活动抛出一个补偿时,相关的补偿handler执行的次数与活动完成的次数相同。
       2.如果是在当前作用域抛出的补偿,则当前作用域的所有活动都将要被补偿,包括并发分支上的活动。
       3.补偿事件会被有层次的触发:如果被补偿的活动时一个子流程,所有包含在这个子流程内的活动都会被触发补偿。如果这个子流程有嵌套的活动,补偿事件会递归的向下抛出。但是补偿事件不会广播到比这个流程高的层级。如果一个补偿在一个子流程内触发,它不会广播到这个子流程的作用域外的活动上去。BPMN规范规定对“同一级别的子流程”上的活动触发补偿。
       4.补偿被补偿事件子流程(compensation event subprocess)消费,如果一个被补偿的活动是一个子流程,并且这个子流程包含一个补偿事件子流程,且这个流程被补偿开始事件触发,那么补偿触发的是这个补偿事件子流程而不是触发这个活动包含的子流程。
       5.补偿是以相反的顺序执行的,这意味着最后完成的活动,最先获得补偿。
       6.中间抛出补偿事件可以用来补偿已经完成的事物子流程

注意:如果补偿在一个作用域内被抛出,这个作用域包含一个子流程并且这个子流程包含一个带有补偿handler的活动,只有当子流程完成时,并且补偿被抛出,补偿才会传播到子流程的补偿handler。如果嵌套在子流程中的某些活动已完成并有附加补偿处理程序,则如果包含这些活动的子流程尚未完成,则补偿行为不会被执行。 考虑以下示例:

图1:补偿事件

       在图示的流程中,有两个并发的执行,一个执行被包含的子流程,一个执行信用卡充值活动。我们假设两个执行都已经开始了,并且第一个第一个执行正在等待一个用户去完成检查预定任务。第二个执行正在执行信用卡充值的活动并且一个错误被抛出,这个错误会导致取消补偿事件触发补偿。在这时这个并行的子流程还没完成,这意味着这个补偿事件没有传播到这个子流程,因此 取消酒店预定补偿handler没有执行。如果这个检查预定活动在取消预定抛出事件之前被执行,补偿事件会传播到这个被包含的子流程里。

注意:多实例活动抛出补偿时,只有当所有的流程实例都结束了相关的补偿handler才会执行。这意味着多实例活动在被补偿前必须先被结束掉。

流程变量:在补偿一个被包含的子流程时,用于执行补偿的handler可以访问子流程完成后,子流程的本地流程变量(local process variables)。为此,子流程作用域内的流程变量将被作为快照保存起来。

由此,我们可以得出一些推论:
       1.补偿handler不会去访问当前执行中的子流程中的流程变量
       2.快照里不包含与更高层执行相关的流程变量,例如与流程实例执行相关的流程变量:补偿handler可以在补偿被抛出时的状态下去访问这些流程变量
       3.变量快照只在被包含的子流程中被采用,其他活动不被支持
当前的一些限制:
       1.waitForCompletion="false"在补偿事件中是不被支持的,当用中间抛出补偿事件(intermediate throwing compensation)触发补偿时,在补偿完成后只剩下这个事件(the event is only left after compensation completed successfully)
       2.补偿本身是被并发执行的,这个并发执行的顺序与被不补偿活动完成的顺序相反,之后的版本可能会包含一个可选的补偿执行顺序。
       3.补偿不会广播到由调用活动产生子流程中去(懵逼脸)

定义一个中间补偿抛出事件:

       补偿中间事件被定义为一个中间抛出事件,在这个例子中特定类型的子元素是compensateEventDefinition元素:

<intermediateThrowEvent id="throwCompensation">
  <compensateEventDefinition />
</intermediateThrowEvent>

       另外,可选参数activityRef可以触发一个特定活动或者作用域的补偿:

<intermediateThrowEvent id="throwCompensation">
  <compensateEventDefinition activityRef="bookHotel" />
</intermediateThrowEvent>

二、补偿结束事件(Compensation End Event):

       补偿结束事件触发补偿,并且结束当前执行路径。它与补偿中间抛出事件具有相同的行为和限制。

<endEvent id="throwCompensation">
  <compensateEventDefinition />
</endEvent>

三、补偿边界事件(Compensation Boundary Event):

       依附于一个活动的边界上的中间捕获补偿事件。简称补偿边界事件。用作附着一个补偿handler到一个活动或者一个被包含的子流程上。
       补偿边界事件必须直接引用一个相关的补偿handler。
       与其他边界事件相比,补偿边界事件有不同的行为策略。其他的边界事件,例如信号边界事件,当活动到达时,信号边界事件就开始了,当活动结束,它也就结束了,并且相关的事件订阅也被取消。补偿边界事件不同,补偿边界事件只有当被依附的活动完全结束后,才会被激活。与此同时,相关的边界事件订阅被创建。当边界事件被触发或者相关的流程实例结束,这个订阅也会被删除。

这就引出了下面的几点:
       1.当补偿被触发时,被补偿边界事件依附的活动完成的同时,这个与补偿边界事件关联的补偿handler被调用。
       2.如果一个补偿事件依附了一个多实例活动,那么会为每一个补偿事件创建一个订阅。
       3.如果补偿边界事件依附于一个活动,且这个活动被包含在一个循环中。则每次这个活动被执行时,都会给它创建一个补偿事件订阅。
       4.如果流程实例结束,那么补偿事件订阅也就将被取消掉。

定义一个补偿边界事件:
<boundaryEvent id="compensateBookHotelEvt" attachedToRef="bookHotel" >
  <compensateEventDefinition />
</boundaryEvent>

<association associationDirection="One" id="a1"  sourceRef="compensateBookHotelEvt" targetRef="undoBookHotel" />

<serviceTask id="undoBookHotel" isForCompensation="true" camunda:class="..." />

       因为补偿边界事件是在活动完全结束后才被激活的,所以cancelActivity属性是不被支持的。

四、补偿开始事件(Compensation Start Event):

       补偿开始事件只被用作触发一个事件子流程,它不可以被用作发起一个流程实例。这种类型的子流程被称作补偿事件子流程。

部署一个补偿事件子流程的流程定义时,需要注意一下几点:
       1.补偿事件子流程只支持被包含的子流程,不是流程级别的。因为这个限制,补偿不会传播到由调用活动产生的子流程实例。
       2.在同一层级的子流程只允许有一个补偿事件子流程
       3.带有补偿事件子流程的子流程不支持被一个补偿边界事件依赖,因为补偿事件子流程和补偿边界事件有相同的意图,所以他们只能有一个被选用。

       补偿事件子流程可以被用作一个被子流程包含的补偿handler。类似补偿边界事件依附一个子流程,补偿事件子流程也只有在补偿事件被抛出时才会被调用。在子流程完成之前,补偿事件子流程将会被调用跟子流程完成的次数相同的次数,在下面这个例子中:
图2:补偿开始事件

       上面的流程中包含一个被包含的补偿事件子流程,这个补偿事件子流程将会被补偿开始事件触发。注意,这个补偿handler与默认的补偿handler不一样,因为它是用一个特定的独立于execution指令去触发补偿活动。它也包含一个附加流程活动,这个附加逻辑无法从子流程自身派生出来。

定义一个补偿开始事件:

       下面这个xml表示一个补偿开始事件是一个带有compensateEventDefinition子元素的普通开始事件:

<subProcess id="compensationEventSubprocess" triggeredByEvent="true">
  <startEvent id="compensationStart" >
    <compensateEventDefinition />
  </startEvent>
  <!-- ... -->
</subProcess>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 228,197评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,415评论 3 415
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 176,104评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,884评论 1 309
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,647评论 6 408
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,130评论 1 323
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,208评论 3 441
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,366评论 0 288
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,887评论 1 334
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,737评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,939评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,478评论 5 358
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,174评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,586评论 0 26
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,827评论 1 283
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,608评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,914评论 2 372