Flowable實戰(zhàn)(四)BPMN2.0 啟動與結(jié)束事件

一颅围、BPMN2.0

BPMN2.0規(guī)范是一個標(biāo)準(zhǔn),開源框架和不同供應(yīng)商都遵循這份標(biāo)準(zhǔn)恨搓,使得最終用戶不會因為依賴專有解決方案院促,而被供應(yīng)商“綁架”。有了BPMN2.0標(biāo)準(zhǔn)斧抱,不同解決方案之間的遷移常拓,變得十分簡單平滑。

缺點則是標(biāo)準(zhǔn)通常是不同觀點大量討論與妥協(xié)的結(jié)果辉浦,有些結(jié)構(gòu)或方法會十分笨重弄抬。Flowable在實現(xiàn)規(guī)范的基礎(chǔ)上進行了功能和使用性擴展。

  • 自定義擴展是在標(biāo)準(zhǔn)方式的基礎(chǔ)上進行簡化宪郊。因此當(dāng)你決定使用自定義擴展時掂恕,仍然可以用標(biāo)準(zhǔn)方式。

  • 使用自定義擴展時弛槐,總是通過flowable:命名空間前綴懊亡,明確標(biāo)識出XML元素、屬性等丐黄。

  • Flowable引擎也支持activiti:命名空間前綴斋配。

注:在官方文檔中,啟動和結(jié)束事件已有較詳細的介紹灌闺,是英文版艰争。啟動和結(jié)束事件是流程里重要的內(nèi)容,現(xiàn)在做個匯總整理桂对。

二甩卓、啟動事件

啟動事件(start event)是流程的起點。

  • 啟動事件在XML中蕉斜,類型由子元素聲明來定義逾柿。

  • 啟動事件保持等候狀態(tài)缀棍,直到特定的觸發(fā)器被觸發(fā)。

  • 啟動事件是細線圖形机错。

2.1 空啟動事件

2.1.1 描述

空啟動事件(none Start Event)爬范,指的是未指定觸發(fā)器,由用戶調(diào)用的啟動事件弱匪。

2.1.2 圖示

空啟動事件用空心圓圈表示青瀑,中間沒有圖標(biāo)(也就是說,沒有觸發(fā)器)萧诫。

空啟動.png

2.1.3 XML表示

空啟動事件的XML表示格式斥难,就是普通的啟動事件聲明,而沒有任何子元素(其他種類的啟動事件都有用于聲明其類型的子元素)帘饶。

 <startEvent id="start" name="my start event" />

2.1.4 使用方法:

 ProcessInstance processInstance = runtimeService.startProcessInstanceByXXX();

2.1.5 自定義擴展

formKey: 引用表單定義哑诊,用戶需要在啟動時填寫的表單。(目前只需了解到啟動事件可以綁定表單即可及刻,詳細內(nèi)容在表單章節(jié)中講解镀裤。)

 <startEvent id="request" flowable:formKey="simpleForm" />

2.2 定時器啟動事件

2.2.1 描述

定時器啟動事件(timer start event)在指定時間內(nèi)創(chuàng)建一次或多次的流程實例。

  • 定時器啟動事件提茁,在流程部署的同時就開始計時淹禾。不需要調(diào)用startProcessInstanceByXXX就會在時間啟動馁菜。調(diào)用startProcessInstanceByXXX時會在定時啟動之外額外啟動一個流程茴扁。

  • 當(dāng)部署帶有定時器啟動事件的流程的更新版本時,上一版本的定時器作業(yè)會被移除汪疮。這是因為通常并不希望舊版本的流程仍然自動啟動新的流程實例峭火。

2.2.2 圖示

定時器啟動事件,用其中有一個鐘表圖標(biāo)的圓圈來表示智嚷。

定時器.png

2.2.3 XML表示

定時器啟動事件的XML表示格式卖丸,是普通的啟動事件聲明加上定時器定義子元素。

定時器定義必須且只能包含下列的一種元素:

  • timeDate盏道。這個元素指定了ISO 8601格式的固定時間稍浆。在這個時間就會觸發(fā)觸發(fā)器。例如:
 <timerEventDefinition>
 <timeDate>2022-01-11T12:13:14</timeDate>
 </timerEventDefinition>
  • timeDuration猜嘱。要定義定時器需要等待多長時間再觸發(fā)衅枫,同樣使用ISO 8601格式(BPMN 2.0規(guī)范要求)。例如(等待10天):
<timerEventDefinition>
 <timeDuration>P10D</timeDuration>
 </timerEventDefinition>
  • timeCycle朗伶。指定重復(fù)周期弦撩,可用于周期性啟動流程。例如(重復(fù)三次啟動论皆,每次間隔為10小時益楼,到指定時間時結(jié)束重復(fù)):
     <timerEventDefinition>
     <timeCycle>R3/PT10H/2022-01-12T23:59:59+00:00</timeCycle>
     </timerEventDefinition>
也可以使用變量猾漫,如*${EndDate}*
    <timerEventDefinition>
     <timeCycle>R3/PT10H/${EndDate}</timeCycle>
     </timerEventDefinition>

2.3 消息啟動事件

2.3.1 描述

消息啟動事件(message start event)使用具名消息啟動流程實例。消息名用于定位指定的啟動事件感凤。

當(dāng)部署具有一個或多個消息啟動事件的流程定義時悯周,會做如下判斷:

  • 一個流程定義不得包含多個同名的消息啟動事件。

  • 在流程定義中陪竿,一個或多個消息啟動事件引用了已經(jīng)部署的另一流程定義中消息啟動事件的消息名队橙,則會拋出異常。

  • 流程版本:在部署流程定義的新版本時萨惑,會取消上一版本的消息訂閱捐康,即使新版本中并沒有這個消息事件。

2.3.2 圖示

消息啟動事件用其中有一個消息事件標(biāo)志的圓圈表示庸蔼。這個標(biāo)志并未填充解总,用以表示捕獲(接收)行為。

消息啟動.png

2.3.3 XML表示

消息啟動事件的XML表示格式姐仅,為普通啟動事件聲明加上messageEventDefinition子元素:

 <definitions id="definitions"
 xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
 xmlns:flowable="http://flowable.org/bpmn"
 targetNamespace="Examples"
 xmlns:tns="Examples">

 <message id="newInvoice" name="newInvoiceMessage" />

 <process id="invoiceProcess">

 <startEvent id="messageStart" >
 <messageEventDefinition messageRef="tns:newInvoice" />
 </startEvent>
 ...
 </process>

 </definitions>

2.3.4 使用方法

啟動流程實例時花枫,可以使用下列RuntimeService中的方法,觸發(fā)消息啟動事件:

    ProcessInstance startProcessInstanceByMessage(String messageName);
    ProcessInstance startProcessInstanceByMessage(String messageName, Map<String, Object> processVariables);
    ProcessInstance startProcessInstanceByMessage(String messageName, String businessKey,
        Map<String, Object< processVariables);

messageName是由message元素的name屬性給定的名字掏膏。messageEventDefinition的messageRef屬性會引用message元素劳翰。

2.4 信號啟動事件

2.4.1 描述

信號啟動事件(signal start event),使用具名信號啟動流程實例馒疹。

2.4.2 圖示

信號啟動事件用其中有一個信號事件標(biāo)志的圓圈表示佳簸。這個標(biāo)志并未填充,用以表示捕獲(接收)行為颖变。

信號啟動.png

2.4.3 XML表示

信號啟動事件的XML表示格式生均,為普通啟動事件聲明,加上signalEventDefinition子元素:

<signal id="theSignal" name="The Signal" />

<process id="processWithSignalStart1">
  <startEvent id="theStart">
    <signalEventDefinition id="theSignalEventDefinition" signalRef="theSignal"  />
  </startEvent>
  <sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />
  <userTask id="theTask" name="Task in process A" />
  <sequenceFlow id="flow2" sourceRef="theTask" targetRef="theEnd" />
  <endEvent id="theEnd" />
</process>

2.4.4 使用方法

信號可以由流程實例中的信號拋出中間事件(intermediary signal throw event)腥刹,或者API(runtimeService.signalEventReceivedXXX方法)觸發(fā)马胧。

兩種方式都會啟動所有擁有相同名字信號啟動事件的流程定義。

請注意可以選擇異步還是同步啟動流程實例衔峰。

需要為API傳遞的signalName佩脊,是由signal元素的name屬性決定的名字。signal元素由signalEventDefinition的signalRef屬性引用垫卤。

注意:消息與信號的區(qū)別:消息是一對一的威彰,一個消息只能啟動一個流程事件。信號是全局的葫男,廣播式的抱冷,一個信號可以啟動多個流程事件。

2.5 異常啟動事件

2.5.1 描述

異常啟動事件(error start event)梢褐,可用于觸發(fā)事件子流程(Event Sub-Process)旺遮。異常啟動事件不能用于啟動流程實例赵讯。

2.5.2 圖示

異常啟動事件用其中有一個異常事件標(biāo)志的圓圈表示。這個標(biāo)志并未填充耿眉,用以表示捕獲(接收)行為边翼。

異常啟動.png

2.5.3 XML表示

異常啟動事件的XML表示格式,為普通啟動事件聲明加上errorEventDefinition子元素:

    <startEvent id="messageStart" >
            <errorEventDefinition errorRef="someError" />
    </startEvent>

三鸣剪、結(jié)束事件

結(jié)束事件(end event)標(biāo)志著流程或子流程中一個分支的結(jié)束组底。結(jié)束事件總是拋出(型)事件。這意味著當(dāng)流程執(zhí)行到達結(jié)束事件時筐骇,會拋出一個結(jié)果债鸡。結(jié)果的類型由事件內(nèi)部的黑色圖標(biāo)表示。在XML表示中铛纬,類型由子元素聲明給出厌均。

3.1 空結(jié)束事件

3.1.1 描述

空結(jié)束事件(none end event),意味著當(dāng)?shù)竭_這個事件時告唆,沒有特別指定拋出的結(jié)果棺弊。因此,引擎除了結(jié)束當(dāng)前執(zhí)行分支之外擒悬,不會多做任何事情模她。

3.1.2 圖示

空結(jié)束事件,用其中沒有圖標(biāo)(沒有結(jié)果類型)的粗圓圈表示懂牧。

空結(jié)束.png

3.1.3 XML表示

空事件的XML表示格式為普通結(jié)束事件聲明侈净,沒有任何子元素(其它種類的結(jié)束事件都有子元素,用于聲明其類型)归苍。

    <endEvent id="end" name="my end event" />

3.2 異常結(jié)束事件

3.2.1 描述

當(dāng)流程執(zhí)行到達異常結(jié)束事件(error end event)時用狱,結(jié)束執(zhí)行的當(dāng)前分支运怖,并拋出錯誤拼弃。

3.2.2 圖示

異常結(jié)束事件事件用內(nèi)部有一個異常圖標(biāo)的標(biāo)準(zhǔn)結(jié)束事件(粗圓圈)表示。異常圖標(biāo)是全黑的摇展,代表拋出的含義吻氧。

異常結(jié)束.png

3.2.3 XML表示

異常結(jié)束事件表示為結(jié)束事件,加上errorEventDefinition子元素:

    <endEvent id="myErrorEndEvent">
      <errorEventDefinition errorRef="myError" />
    </endEvent>

errorRef屬性可以引用在流程外定義的error元素:

    <error id="myError" errorCode="123" />
    ...
    <process id="myProcess">
    ...

errorerrorCode用于查找匹配的異常捕獲邊界事件咏连。如果errorRef不匹配任何已定義的error盯孙,則該errorRef會用做errorCode的快捷方式。這個快捷方式是Flowable特有的祟滴。下面的代碼片段在功能上是相同的振惰。

    <error id="myError" errorCode="error123" />
    ...
    <process id="myProcess">
    ...
      <endEvent id="myErrorEndEvent">
        <errorEventDefinition errorRef="myError" />
      </endEvent>
    ...

與下面的代碼功能相同

    <endEvent id="myErrorEndEvent">
      <errorEventDefinition errorRef="error123" />
    </endEvent>

請注意errorRef必須遵從BPMN 2.0規(guī)范。

3.3 終止結(jié)束事件

3.3.1 描述

當(dāng)?shù)竭_終止結(jié)束事件(terminate end event)時垄懂,當(dāng)前的流程實例或子流程會被終止骑晶。也就是說痛垛,當(dāng)執(zhí)行到達終止結(jié)束事件時,會判斷第一個范圍 scope(流程或子流程)并終止它桶蛔。請注意在BPMN 2.0中匙头,子流程可以是嵌入式子流程,調(diào)用活動仔雷,事件子流程蹂析,或事務(wù)子流程。有一條通用規(guī)則:當(dāng)存在多實例的調(diào)用過程或嵌入式子流程時碟婆,只會終止一個實例电抚,其他的實例與流程實例不會受影響。

可以添加一個可選屬性terminateAll竖共。當(dāng)其為true時喻频,無論該終止結(jié)束事件在流程定義中的位置,也無論它是否在子流程(甚至是嵌套子流程)中肘迎,都會終止(根)流程實例甥温。

3.3.2 圖示

終止結(jié)束事件用內(nèi)部有一個全黑圓的標(biāo)準(zhǔn)結(jié)束事件(粗圓圈)表示。

終止結(jié)束.png

3.3.4 XML表示

終止結(jié)束事件妓布,表示為結(jié)束事件姻蚓,加上terminateEventDefinition子元素。

請注意terminateAll屬性是可選的(默認(rèn)為false)匣沼。

    <endEvent id="myEndEvent >
      <terminateEventDefinition flowable:terminateAll="true"></terminateEventDefinition>
    </endEvent>

3.4 取消結(jié)束事件

3.4.1 描述

取消結(jié)束事件(cancel end event)只能與BPMN事務(wù)子流程(BPMN transaction subprocess)一起使用狰挡。當(dāng)?shù)竭_取消結(jié)束事件時,會拋出取消事件释涛,且必須由取消邊界事件(cancel boundary event)捕獲加叁。取消邊界事件將取消事務(wù),并觸發(fā)補償(compensation)唇撬。

3.4.2 圖示

取消結(jié)束事件用內(nèi)部有一個取消圖標(biāo)的標(biāo)準(zhǔn)結(jié)束事件(粗圓圈)表示它匕。取消圖標(biāo)是全黑的,代表拋出的含義窖认。

取消結(jié)束.png

3.4.3 XML表示

取消結(jié)束事件豫柬,表示為結(jié)束事件,加上cancelEventDefinition子元素扑浸。

    <endEvent id="myCancelEndEvent">
      <cancelEventDefinition />
    </endEvent>

四烧给、小結(jié)

理論是實踐的基礎(chǔ),本篇匯總BPMN2.0 規(guī)范和Flowable擴展下的啟動和結(jié)束事件喝噪,為后面的實戰(zhàn)做準(zhǔn)備础嫡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市酝惧,隨后出現(xiàn)的幾起案子榴鼎,更是在濱河造成了極大的恐慌涧尿,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件檬贰,死亡現(xiàn)場離奇詭異姑廉,居然都是意外死亡,警方通過查閱死者的電腦和手機翁涤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門桥言,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葵礼,你說我怎么就攤上這事号阿。” “怎么了鸳粉?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵扔涧,是天一觀的道長。 經(jīng)常有香客問我届谈,道長枯夜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任艰山,我火速辦了婚禮湖雹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘曙搬。我一直安慰自己摔吏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布纵装。 她就那樣靜靜地躺著征讲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪橡娄。 梳的紋絲不亂的頭發(fā)上诗箍,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音瀑踢,去河邊找鬼扳还。 笑死,一個胖子當(dāng)著我的面吹牛橱夭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播桑逝,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼棘劣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了楞遏?” 一聲冷哼從身側(cè)響起茬暇,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤首昔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后糙俗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勒奇,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年巧骚,在試婚紗的時候發(fā)現(xiàn)自己被綠了赊颠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡劈彪,死狀恐怖竣蹦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沧奴,我是刑警寧澤痘括,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站滔吠,受9級特大地震影響纲菌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疮绷,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一驰后、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矗愧,春花似錦灶芝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至属愤,卻和暖如春女器,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背住诸。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工驾胆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贱呐。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓丧诺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奄薇。 傳聞我的和親對象是個殘疾皇子驳阎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容