定義
取消結(jié)束事件只能與 BPMN 事務(wù)子流程結(jié)合使用,它可以取消一個事務(wù)子流程的執(zhí)行,同時
也只能在子流程中執(zhí)行。實(shí)際應(yīng)用中,會把取消事件,事務(wù)子流程,補(bǔ)償事件一起用。當(dāng)?shù)竭_(dá)取消
結(jié)束事件時,會拋出取消事件,它必須被取消邊界事件捕獲。取消邊界事件會取消事務(wù),并觸發(fā)補(bǔ)
償機(jī)制。
圖形標(biāo)記
取消結(jié)束事件顯示為標(biāo)準(zhǔn)的結(jié)束事件(粗邊圓圈),包含一個取消圖標(biāo)。取消圖標(biāo)是全黑的,
表示觸發(fā)語法,如圖所示:
XML內(nèi)容
取消結(jié)束事件內(nèi)容是一個結(jié)束事件,包含 cancelEventDefinition 子元素:
<process id="cancelEndEventProcess">
<endEvent id="cancelEndEvent">
<cancelEventDefinition/>
</endEvent>
</process>
使用示例
取消結(jié)束事件,只能與事務(wù)子流程(Transaction Subprocess)一起使用。當(dāng)?shù)竭_(dá)取消結(jié)束事件
時,會拋出取消事件,且必須由取消邊界事件(Cancel Boundary Event)捕獲。之后這個取消邊界
事件將取消事務(wù),并觸發(fā)補(bǔ)償(compensation)。
下面我們看一個使用取消結(jié)束事件的示例流程,如圖所示是一個系統(tǒng)上線流程,流程啟
動后進(jìn)入系統(tǒng)上線事務(wù)子流程,首先到達(dá)“人工上線”用戶任務(wù)節(jié)點(diǎn),辦理完成后到達(dá)取消結(jié)束事
件,拋出取消事件,觸發(fā)“自動回滾”補(bǔ)償,并觸發(fā)取消邊界事件以及結(jié)束子流程進(jìn)而流轉(zhuǎn)到“用
戶排查”用戶任務(wù)節(jié)點(diǎn)。這個示例流程中涉及到用戶任務(wù)節(jié)點(diǎn)、服務(wù)任務(wù)節(jié)點(diǎn)、事務(wù)子流程和取消
邊界事件,這些都是 BPMN 定義的流程元素,在后面的章節(jié)中會展開介紹。
<error id="errorFlag" errorCode="500" />
<process id="ThransactionSubProcessTest" name="子流程-事務(wù)子流程" isExecutable="true">
<startEvent id="a1bc9933739624c6694151aff2dce872b" />
<userTask id="aa49686c18f1c48879976ba75a55fcbc6" name="用戶提交訂單">
<extensionElements>
<flowable:formData />
<flowable:assigneeType>static</flowable:assigneeType>
</extensionElements>
</userTask>
<sequenceFlow id="ab3c3111802e74e1c829879ce06ef62f1" sourceRef="a1bc9933739624c6694151aff2dce872b" targetRef="aa49686c18f1c48879976ba75a55fcbc6" />
<transaction id="Activity_1vnyjkd" name="事務(wù)子流程">
<startEvent id="Event_12nf6w8">
<extensionElements>
<flowable:formData />
</extensionElements>
</startEvent>
<sequenceFlow id="Flow_1qdwcnq" sourceRef="Event_12nf6w8" targetRef="Gateway_1swfvxl" />
<parallelGateway id="Gateway_1swfvxl" />
<sequenceFlow id="Flow_17rtq7v" sourceRef="Gateway_1swfvxl" targetRef="Activity_1gw2yen" />
<serviceTask id="Activity_1gw2yen" name="鎖定庫存" flowable:class="com.dragon.test.bpmn.delegate.TreasuryLockService">
<extensionElements>
<flowable:formData />
<flowable:assigneeType>static</flowable:assigneeType>
</extensionElements>
</serviceTask>
<userTask id="Activity_0s32nn4" name="用戶取消訂單">
<extensionElements>
<flowable:formData />
<flowable:assigneeType>static</flowable:assigneeType>
</extensionElements>
</userTask>
<sequenceFlow id="Flow_0x4x7li" sourceRef="Gateway_1swfvxl" targetRef="Activity_0s32nn4" />
<userTask id="Activity_0k0ojol" name="用戶支付訂單">
<extensionElements>
<flowable:formData />
<flowable:assigneeType>static</flowable:assigneeType>
</extensionElements>
</userTask>
<sequenceFlow id="Flow_107046y" sourceRef="Activity_1gw2yen" targetRef="Activity_0k0ojol" />
<sequenceFlow id="Flow_1yuazgn" sourceRef="Activity_0k0ojol" targetRef="Activity_0bi67sc" />
<serviceTask id="Activity_0bi67sc" name="扣減庫存" flowable:class="com.dragon.test.bpmn.delegate.TreasuryDeductService">
<extensionElements>
<flowable:assigneeType>static</flowable:assigneeType>
<flowable:formData />
</extensionElements>
</serviceTask>
<endEvent id="Event_167temk" />
<sequenceFlow id="Flow_0pkp6lj" sourceRef="Activity_0bi67sc" targetRef="Event_167temk" />
<endEvent id="Event_1mt0jp2">
<cancelEventDefinition />
</endEvent>
<boundaryEvent id="Event_1w62z13" attachedToRef="Activity_0bi67sc">
<errorEventDefinition errorRef="errorFlag" flowable:errorVariableLocalScope="false" flowable:errorVariableTransient="false" />
</boundaryEvent>
<boundaryEvent id="Event_0fblty6" name="30分鐘" attachedToRef="Activity_0k0ojol">
<timerEventDefinition>
<timeDuration>PT3M</timeDuration>
</timerEventDefinition>
</boundaryEvent>
<boundaryEvent id="Event_0dzq6vl" attachedToRef="Activity_1gw2yen">
<compensateEventDefinition />
</boundaryEvent>
<serviceTask id="Activity_15oy2bt" name="釋放庫存" isForCompensation="true" flowable:class="com.dragon.test.bpmn.delegate.TreasuryReleaseService" />
<boundaryEvent id="Event_0rv7u1v" attachedToRef="Activity_0k0ojol">
<compensateEventDefinition />
</boundaryEvent>
<serviceTask id="Activity_0gw5xlk" name="費(fèi)用退回" isForCompensation="true" flowable:class="com.dragon.test.bpmn.delegate.RefundPaymentService" />
<association id="Association_1a1b669" associationDirection="One" sourceRef="Event_0dzq6vl" targetRef="Activity_15oy2bt" />
<association id="Association_0vig570" associationDirection="One" sourceRef="Event_0rv7u1v" targetRef="Activity_0gw5xlk" />
</transaction>
<sequenceFlow id="Flow_0ynhbof" sourceRef="aa49686c18f1c48879976ba75a55fcbc6" targetRef="Activity_1vnyjkd" />
<boundaryEvent id="Event_0lxd35r" attachedToRef="Activity_1vnyjkd">
<cancelEventDefinition />
</boundaryEvent>
<sequenceFlow id="Flow_0p83e5j" sourceRef="Event_0lxd35r" targetRef="Activity_0xmvtli" />
<serviceTask id="Activity_0xmvtli" name="自動取消訂單" flowable:class="com.dragon.test.bpmn.delegate.CancelOrderService">
<extensionElements>
<flowable:formData />
<flowable:assigneeType>static</flowable:assigneeType>
</extensionElements>
</serviceTask>
<endEvent id="Event_0h8me6c" />
<sequenceFlow id="Flow_1vvt0is" sourceRef="Activity_0xmvtli" targetRef="Event_0h8me6c" />
<endEvent id="Event_1954lc4" />
<sequenceFlow id="Flow_0kcxljy" sourceRef="Activity_1vnyjkd" targetRef="Event_1954lc4" />
</process>
::: warning 注意
⑴取消結(jié)束事件只能使用在事務(wù)子流程中
⑵取消結(jié)束事件會觸發(fā)依附在子流程上的取消邊界事件(取消結(jié)束事件會被拋出,而取消邊界
事件則會捕獲事件)
⑶在 BPMN2.0 中對于已經(jīng)完成的活動,可以使用補(bǔ)償機(jī)制,而對于一些正在進(jìn)行的活動,不
能使用補(bǔ)償機(jī)制,而使用取消機(jī)制。取消事件一定要包含補(bǔ)償事件,否則無法運(yùn)行,會拋出
org.flowable.common.engine.api.FlowableException: No execution found for sub process of boundary cancel event ***的
異常
:::
視頻教程
取消結(jié)束事件文章來源:http://www.zghlxwxcb.cn/news/detail-635018.html
演示demo
取消結(jié)束事件
本文中內(nèi)容和案例出自賀波老師的書《深入Activiti流程引擎:核心原理與高階實(shí)戰(zhàn)》,書中的介紹更全面、詳細(xì),推薦給大家。
深入Activiti流程引擎文章來源地址http://www.zghlxwxcb.cn/news/detail-635018.html
到了這里,關(guān)于Flowable-結(jié)束事件-取消結(jié)束事件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!