一颅围、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ā)器)萧诫。
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)的圓圈來表示智嚷。
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)志并未填充解总,用以表示捕獲(接收)行為。
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)志并未填充,用以表示捕獲(接收)行為颖变。
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)志并未填充耿眉,用以表示捕獲(接收)行為边翼。
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é)果類型)的粗圓圈表示懂牧。
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)是全黑的摇展,代表拋出的含義吻氧。
3.2.3 XML表示
異常結(jié)束事件表示為結(jié)束事件,加上errorEventDefinition子元素:
<endEvent id="myErrorEndEvent">
<errorEventDefinition errorRef="myError" />
</endEvent>
errorRef屬性可以引用在流程外定義的error元素:
<error id="myError" errorCode="123" />
...
<process id="myProcess">
...
error的errorCode用于查找匹配的異常捕獲邊界事件咏连。如果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é)束事件(粗圓圈)表示。
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)是全黑的,代表拋出的含義窖认。
3.4.3 XML表示
取消結(jié)束事件豫柬,表示為結(jié)束事件,加上cancelEventDefinition子元素扑浸。
<endEvent id="myCancelEndEvent">
<cancelEventDefinition />
</endEvent>
四烧给、小結(jié)
理論是實踐的基礎(chǔ),本篇匯總BPMN2.0 規(guī)范和Flowable擴展下的啟動和結(jié)束事件喝噪,為后面的實戰(zhàn)做準(zhǔn)備础嫡。