camunda之——取消和補(bǔ)償事件(Cancel and Compensation Events)

取消事件(Cancel Events):

一、取消結(jié)束事件(Cancel End Event):

?????? 取消結(jié)束事件只能與事務(wù)子流程配合使用。當(dāng)流程到達(dá)取消結(jié)束事件,一個(gè)取消事件將會(huì)被拋出约素,這個(gè)取消事件必須被一個(gè)取消邊界事件捕獲。這取消邊界事件隨后會(huì)取消這個(gè)事務(wù)并觸發(fā)補(bǔ)償秩仆。

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

?????? 依附于事務(wù)子流程的上的中間捕獲取消邊界事件猾封,或者簡(jiǎn)稱(chēng)取消邊界事件澄耍。當(dāng)一個(gè)事務(wù)被取消時(shí),取消邊界事件將會(huì)被觸發(fā)晌缘。當(dāng)取消邊界事件被觸發(fā)后齐莲,它首先打斷在這個(gè)作用域下的所有活動(dòng)的執(zhí)行。接下來(lái)磷箕,它會(huì)開(kāi)始執(zhí)行補(bǔ)償所有在這個(gè)事務(wù)的作用域內(nèi)的活動(dòng)的補(bǔ)償邊界事件选酗。補(bǔ)償行為是同步的,就是說(shuō)邊界事件會(huì)一直等待到補(bǔ)償事件完成后才會(huì)離開(kāi)事務(wù)岳枷。即當(dāng)補(bǔ)償完成后芒填,這個(gè)事務(wù)子流程會(huì)離開(kāi)取消邊界事件。

注意:
?????? 1.一個(gè)事務(wù)子流程只允許有一個(gè)取消邊界事件
?????? 2.如果事務(wù)子流程有嵌套的子流程空繁,只有那些子流程已經(jīng)完全成功的子流程才會(huì)觸發(fā)補(bǔ)償
?????? 3.如果取消邊界事件放置在多個(gè)流程實(shí)例的事務(wù)子流程上殿衰,如果一個(gè)實(shí)例觸發(fā)取消,所有的實(shí)例都會(huì)取消盛泡。

?????? 一個(gè)典型的邊界事件的定義:

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

?????? 因?yàn)槿∠吔缡录偸强芍袛嗟拿葡椋圆恍枰猚ancelActivity屬性

補(bǔ)償事件(Compensation Events):

一、中間拋出補(bǔ)償事件(Intermediate Throwing Compensation Event):

?????? 中間拋出補(bǔ)償事件用于觸發(fā)一個(gè)補(bǔ)償:

觸發(fā)補(bǔ)償:補(bǔ)償事件可以被指定的活動(dòng)觸發(fā)傲诵,或者一個(gè)擁有補(bǔ)償事件的作用域觸發(fā)凯砍。補(bǔ)償?shù)膱?zhí)行是通過(guò)一個(gè)活動(dòng)的補(bǔ)償handler的execution來(lái)執(zhí)行補(bǔ)償
?????? 1.當(dāng)為某個(gè)活動(dòng)拋出一個(gè)補(bǔ)償時(shí),相關(guān)的補(bǔ)償handler執(zhí)行的次數(shù)與活動(dòng)完成的次數(shù)相同拴竹。
?????? 2.如果是在當(dāng)前作用域拋出的補(bǔ)償悟衩,則當(dāng)前作用域的所有活動(dòng)都將要被補(bǔ)償,包括并發(fā)分支上的活動(dòng)栓拜。
?????? 3.補(bǔ)償事件會(huì)被有層次的觸發(fā):如果被補(bǔ)償?shù)幕顒?dòng)時(shí)一個(gè)子流程座泳,所有包含在這個(gè)子流程內(nèi)的活動(dòng)都會(huì)被觸發(fā)補(bǔ)償斑响。如果這個(gè)子流程有嵌套的活動(dòng),補(bǔ)償事件會(huì)遞歸的向下拋出钳榨。但是補(bǔ)償事件不會(huì)廣播到比這個(gè)流程高的層級(jí)。如果一個(gè)補(bǔ)償在一個(gè)子流程內(nèi)觸發(fā)纽门,它不會(huì)廣播到這個(gè)子流程的作用域外的活動(dòng)上去薛耻。BPMN規(guī)范規(guī)定對(duì)“同一級(jí)別的子流程”上的活動(dòng)觸發(fā)補(bǔ)償。
?????? 4.補(bǔ)償被補(bǔ)償事件子流程(compensation event subprocess)消費(fèi)赏陵,如果一個(gè)被補(bǔ)償?shù)幕顒?dòng)是一個(gè)子流程饼齿,并且這個(gè)子流程包含一個(gè)補(bǔ)償事件子流程,且這個(gè)流程被補(bǔ)償開(kāi)始事件觸發(fā)蝙搔,那么補(bǔ)償觸發(fā)的是這個(gè)補(bǔ)償事件子流程而不是觸發(fā)這個(gè)活動(dòng)包含的子流程缕溉。
?????? 5.補(bǔ)償是以相反的順序執(zhí)行的,這意味著最后完成的活動(dòng)吃型,最先獲得補(bǔ)償证鸥。
?????? 6.中間拋出補(bǔ)償事件可以用來(lái)補(bǔ)償已經(jīng)完成的事物子流程

注意:如果補(bǔ)償在一個(gè)作用域內(nèi)被拋出,這個(gè)作用域包含一個(gè)子流程并且這個(gè)子流程包含一個(gè)帶有補(bǔ)償handler的活動(dòng)勤晚,只有當(dāng)子流程完成時(shí)枉层,并且補(bǔ)償被拋出,補(bǔ)償才會(huì)傳播到子流程的補(bǔ)償handler赐写。如果嵌套在子流程中的某些活動(dòng)已完成并有附加補(bǔ)償處理程序鸟蜡,則如果包含這些活動(dòng)的子流程尚未完成,則補(bǔ)償行為不會(huì)被執(zhí)行挺邀。 考慮以下示例:

圖1:補(bǔ)償事件

?????? 在圖示的流程中揉忘,有兩個(gè)并發(fā)的執(zhí)行,一個(gè)執(zhí)行被包含的子流程端铛,一個(gè)執(zhí)行信用卡充值活動(dòng)泣矛。我們假設(shè)兩個(gè)執(zhí)行都已經(jīng)開(kāi)始了,并且第一個(gè)第一個(gè)執(zhí)行正在等待一個(gè)用戶去完成檢查預(yù)定任務(wù)沦补。第二個(gè)執(zhí)行正在執(zhí)行信用卡充值的活動(dòng)并且一個(gè)錯(cuò)誤被拋出乳蓄,這個(gè)錯(cuò)誤會(huì)導(dǎo)致取消補(bǔ)償事件觸發(fā)補(bǔ)償。在這時(shí)這個(gè)并行的子流程還沒(méi)完成夕膀,這意味著這個(gè)補(bǔ)償事件沒(méi)有傳播到這個(gè)子流程虚倒,因此 取消酒店預(yù)定補(bǔ)償handler沒(méi)有執(zhí)行。如果這個(gè)檢查預(yù)定活動(dòng)在取消預(yù)定拋出事件之前被執(zhí)行产舞,補(bǔ)償事件會(huì)傳播到這個(gè)被包含的子流程里魂奥。

注意:多實(shí)例活動(dòng)拋出補(bǔ)償時(shí),只有當(dāng)所有的流程實(shí)例都結(jié)束了相關(guān)的補(bǔ)償handler才會(huì)執(zhí)行易猫。這意味著多實(shí)例活動(dòng)在被補(bǔ)償前必須先被結(jié)束掉耻煤。

流程變量:在補(bǔ)償一個(gè)被包含的子流程時(shí),用于執(zhí)行補(bǔ)償?shù)膆andler可以訪問(wèn)子流程完成后,子流程的本地流程變量(local process variables)哈蝇。為此棺妓,子流程作用域內(nèi)的流程變量將被作為快照保存起來(lái)。

由此炮赦,我們可以得出一些推論:
?????? 1.補(bǔ)償handler不會(huì)去訪問(wèn)當(dāng)前執(zhí)行中的子流程中的流程變量
?????? 2.快照里不包含與更高層執(zhí)行相關(guān)的流程變量怜跑,例如與流程實(shí)例執(zhí)行相關(guān)的流程變量:補(bǔ)償handler可以在補(bǔ)償被拋出時(shí)的狀態(tài)下去訪問(wèn)這些流程變量
?????? 3.變量快照只在被包含的子流程中被采用,其他活動(dòng)不被支持
當(dāng)前的一些限制:
?????? 1.waitForCompletion="false"在補(bǔ)償事件中是不被支持的吠勘,當(dāng)用中間拋出補(bǔ)償事件(intermediate throwing compensation)觸發(fā)補(bǔ)償時(shí)性芬,在補(bǔ)償完成后只剩下這個(gè)事件(the event is only left after compensation completed successfully)
?????? 2.補(bǔ)償本身是被并發(fā)執(zhí)行的,這個(gè)并發(fā)執(zhí)行的順序與被不補(bǔ)償活動(dòng)完成的順序相反剧防,之后的版本可能會(huì)包含一個(gè)可選的補(bǔ)償執(zhí)行順序植锉。
?????? 3.補(bǔ)償不會(huì)廣播到由調(diào)用活動(dòng)產(chǎn)生子流程中去(懵逼臉)

定義一個(gè)中間補(bǔ)償拋出事件:

?????? 補(bǔ)償中間事件被定義為一個(gè)中間拋出事件,在這個(gè)例子中特定類(lèi)型的子元素是compensateEventDefinition元素:

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

?????? 另外峭拘,可選參數(shù)activityRef可以觸發(fā)一個(gè)特定活動(dòng)或者作用域的補(bǔ)償:

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

二俊庇、補(bǔ)償結(jié)束事件(Compensation End Event):

?????? 補(bǔ)償結(jié)束事件觸發(fā)補(bǔ)償,并且結(jié)束當(dāng)前執(zhí)行路徑鸡挠。它與補(bǔ)償中間拋出事件具有相同的行為和限制暇赤。

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

三、補(bǔ)償邊界事件(Compensation Boundary Event):

?????? 依附于一個(gè)活動(dòng)的邊界上的中間捕獲補(bǔ)償事件宵凌。簡(jiǎn)稱(chēng)補(bǔ)償邊界事件鞋囊。用作附著一個(gè)補(bǔ)償handler到一個(gè)活動(dòng)或者一個(gè)被包含的子流程上。
?????? 補(bǔ)償邊界事件必須直接引用一個(gè)相關(guān)的補(bǔ)償handler瞎惫。
?????? 與其他邊界事件相比溜腐,補(bǔ)償邊界事件有不同的行為策略。其他的邊界事件瓜喇,例如信號(hào)邊界事件挺益,當(dāng)活動(dòng)到達(dá)時(shí),信號(hào)邊界事件就開(kāi)始了乘寒,當(dāng)活動(dòng)結(jié)束望众,它也就結(jié)束了,并且相關(guān)的事件訂閱也被取消伞辛。補(bǔ)償邊界事件不同烂翰,補(bǔ)償邊界事件只有當(dāng)被依附的活動(dòng)完全結(jié)束后,才會(huì)被激活蚤氏。與此同時(shí)甘耿,相關(guān)的邊界事件訂閱被創(chuàng)建。當(dāng)邊界事件被觸發(fā)或者相關(guān)的流程實(shí)例結(jié)束竿滨,這個(gè)訂閱也會(huì)被刪除佳恬。

這就引出了下面的幾點(diǎn):
?????? 1.當(dāng)補(bǔ)償被觸發(fā)時(shí)捏境,被補(bǔ)償邊界事件依附的活動(dòng)完成的同時(shí),這個(gè)與補(bǔ)償邊界事件關(guān)聯(lián)的補(bǔ)償handler被調(diào)用毁葱。
?????? 2.如果一個(gè)補(bǔ)償事件依附了一個(gè)多實(shí)例活動(dòng)垫言,那么會(huì)為每一個(gè)補(bǔ)償事件創(chuàng)建一個(gè)訂閱。
?????? 3.如果補(bǔ)償邊界事件依附于一個(gè)活動(dòng)倾剿,且這個(gè)活動(dòng)被包含在一個(gè)循環(huán)中骏掀。則每次這個(gè)活動(dòng)被執(zhí)行時(shí),都會(huì)給它創(chuàng)建一個(gè)補(bǔ)償事件訂閱柱告。
?????? 4.如果流程實(shí)例結(jié)束,那么補(bǔ)償事件訂閱也就將被取消掉笑陈。

定義一個(gè)補(bǔ)償邊界事件:
<boundaryEvent id="compensateBookHotelEvt" attachedToRef="bookHotel" >
  <compensateEventDefinition />
</boundaryEvent>

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

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

?????? 因?yàn)檠a(bǔ)償邊界事件是在活動(dòng)完全結(jié)束后才被激活的际度,所以cancelActivity屬性是不被支持的。

四涵妥、補(bǔ)償開(kāi)始事件(Compensation Start Event):

?????? 補(bǔ)償開(kāi)始事件只被用作觸發(fā)一個(gè)事件子流程乖菱,它不可以被用作發(fā)起一個(gè)流程實(shí)例。這種類(lèi)型的子流程被稱(chēng)作補(bǔ)償事件子流程蓬网。

部署一個(gè)補(bǔ)償事件子流程的流程定義時(shí)窒所,需要注意一下幾點(diǎn):
?????? 1.補(bǔ)償事件子流程只支持被包含的子流程,不是流程級(jí)別的帆锋。因?yàn)檫@個(gè)限制吵取,補(bǔ)償不會(huì)傳播到由調(diào)用活動(dòng)產(chǎn)生的子流程實(shí)例。
?????? 2.在同一層級(jí)的子流程只允許有一個(gè)補(bǔ)償事件子流程
?????? 3.帶有補(bǔ)償事件子流程的子流程不支持被一個(gè)補(bǔ)償邊界事件依賴(lài)锯厢,因?yàn)檠a(bǔ)償事件子流程和補(bǔ)償邊界事件有相同的意圖皮官,所以他們只能有一個(gè)被選用。

?????? 補(bǔ)償事件子流程可以被用作一個(gè)被子流程包含的補(bǔ)償handler实辑。類(lèi)似補(bǔ)償邊界事件依附一個(gè)子流程捺氢,補(bǔ)償事件子流程也只有在補(bǔ)償事件被拋出時(shí)才會(huì)被調(diào)用。在子流程完成之前剪撬,補(bǔ)償事件子流程將會(huì)被調(diào)用跟子流程完成的次數(shù)相同的次數(shù)摄乒,在下面這個(gè)例子中:
圖2:補(bǔ)償開(kāi)始事件

?????? 上面的流程中包含一個(gè)被包含的補(bǔ)償事件子流程,這個(gè)補(bǔ)償事件子流程將會(huì)被補(bǔ)償開(kāi)始事件觸發(fā)残黑。注意馍佑,這個(gè)補(bǔ)償handler與默認(rèn)的補(bǔ)償handler不一樣,因?yàn)樗怯靡粋€(gè)特定的獨(dú)立于execution指令去觸發(fā)補(bǔ)償活動(dòng)梨水。它也包含一個(gè)附加流程活動(dòng)挤茄,這個(gè)附加邏輯無(wú)法從子流程自身派生出來(lái)。

定義一個(gè)補(bǔ)償開(kāi)始事件:

?????? 下面這個(gè)xml表示一個(gè)補(bǔ)償開(kāi)始事件是一個(gè)帶有compensateEventDefinition子元素的普通開(kāi)始事件:

<subProcess id="compensationEventSubprocess" triggeredByEvent="true">
  <startEvent id="compensationStart" >
    <compensateEventDefinition />
  </startEvent>
  <!-- ... -->
</subProcess>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冰木,一起剝皮案震驚了整個(gè)濱河市穷劈,隨后出現(xiàn)的幾起案子笼恰,更是在濱河造成了極大的恐慌,老刑警劉巖歇终,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件社证,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡评凝,警方通過(guò)查閱死者的電腦和手機(jī)追葡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奕短,“玉大人宜肉,你說(shuō)我怎么就攤上這事◆岜” “怎么了谬返?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)日杈。 經(jīng)常有香客問(wèn)我遣铝,道長(zhǎng),這世上最難降的妖魔是什么莉擒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任酿炸,我火速辦了婚禮,結(jié)果婚禮上涨冀,老公的妹妹穿的比我還像新娘填硕。我一直安慰自己,他們只是感情好鹿鳖,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布廷支。 她就那樣靜靜地躺著,像睡著了一般栓辜。 火紅的嫁衣襯著肌膚如雪恋拍。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天藕甩,我揣著相機(jī)與錄音施敢,去河邊找鬼。 笑死狭莱,一個(gè)胖子當(dāng)著我的面吹牛僵娃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腋妙,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼默怨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了骤素?” 一聲冷哼從身側(cè)響起匙睹,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤愚屁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后痕檬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體霎槐,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年梦谜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丘跌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唁桩,死狀恐怖闭树,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荒澡,我是刑警寧澤报辱,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站仰猖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奈籽。R本人自食惡果不足惜饥侵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衣屏。 院中可真熱鬧躏升,春花似錦、人聲如沸狼忱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钻弄。三九已至佃却,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窘俺,已是汗流浹背饲帅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘤泪,地道東北人灶泵。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像对途,于是被迫代替她去往敵國(guó)和親赦邻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359