1、bpmn的相關(guān)性
任務(wù)和網(wǎng)關(guān)是我們到目前為止了解的三個流元素中的兩個:事情(任務(wù))必須在特定的環(huán)境(網(wǎng)關(guān))下完成。還有一個流元素:應(yīng)該發(fā)生的事情(事件)。對于bpmn流程模型來說,事件的重要性不亞于任務(wù)或網(wǎng)關(guān)。我們應(yīng)該從應(yīng)用它們的一些基本原則開始。比如:
1、捕獲事件并拋出異常。
2、啟動事件、中間事件和結(jié)束事件。
捕獲事件是具有定義觸發(fā)器的事件。我們認為,一旦觸發(fā)器被激活或觸發(fā),它們就會發(fā)生。作為一個智力結(jié)構(gòu),這是相對復(fù)雜的,因此我們通過調(diào)用它們捕捉事件來簡化它。關(guān)鍵在于,這些事件會影響流程的進程,因此必須對其建模。捕獲事件可能導(dǎo)致:
1、這個過程開始
2、進程或進程路徑正在繼續(xù)
3、當前正在處理的任務(wù)或正在取消的子進程
4、執(zhí)行任務(wù)或子進程時使用的另一個進程路徑
bpmn假設(shè)拋出事件是自己觸發(fā)的,而不是對觸發(fā)器做出反應(yīng)??梢哉f,與被動捕獲事件相比,它們是主動捕獲事件。我們簡稱它們?yōu)閽伋鍪录驗槭沁M程觸發(fā)它們的。投擲事件可以:
1、在過程中觸發(fā)
2、在流程結(jié)束時觸發(fā)
因此,啟動事件總是發(fā)生的事件。流程在啟動之前不能觸發(fā)事件。最簡單的啟動事件應(yīng)用程序如圖1.1所示。當事件發(fā)生時,流程啟動。
圖1.1:一旦事件1發(fā)生,流程就會啟動。
注意:圓圈中的問號表示此事件可以分配給特定類型。到目前為止,我們還沒有報道任何事件。下面幾節(jié)將解釋可能的事件類型。
不同的事件可能會觸發(fā)流程,可以對其建模,如圖1.2所示。每個事件觸發(fā)自己的流程實例是很重要的。
圖1.2:一旦事件1或事件2發(fā)生,流程就會啟動。
另一方面,假設(shè)您希望對流程啟動之前必須發(fā)生的幾個事件進行建模。很多人會對這種情況建模,如圖2.31所示。
圖1.3:壞:技術(shù)上來說,這個模型會導(dǎo)致死鎖
這是直觀的,但不幸的是它是不正確的,而且很少有bpmn初學(xué)者理解為什么它是不正確的。原因是and merge不支持相關(guān)性,因此流程將無法識別這兩個事件是關(guān)聯(lián)的。我們會在后續(xù)的文章中詳細介紹bpmn是如何提供解決方案的。
流程可能需要發(fā)生特定的中間事件,如圖1.4所示。任務(wù)1完成后,必須在任務(wù)2完成之前發(fā)生事件1。使用令牌方法時,令牌會在事件1處等待,直到事件發(fā)生為止。只有這樣,令牌才會繼續(xù),并啟動任務(wù)2。
圖1.4:在任務(wù)1之后,流程將等待,直到事件1發(fā)生。只有這樣,它才能繼續(xù)執(zhí)行任務(wù)2。
注意:none事件(如2.2節(jié)中所解釋的)不是捕獲事件。它屬于投擲項目。
我們?nèi)绾伪硎疽粋€進程必須等待兩個事件?我們在圖1.5中顯示的是有缺陷的。任務(wù)1完成后,令牌繼續(xù)并等待事件1發(fā)生。如果事件2發(fā)生時,令牌正在等待事件1,令牌將不會注意到它。更糟糕的是,如果事件1發(fā)生在事件2之后,令牌將繼續(xù),然后等待事件2發(fā)生。由于事件2已經(jīng)發(fā)生,令牌將永遠等待。
圖1.5:順序的中間事件只能一個接一個地被識別
因此,捕獲事件的語義不是檢查可能已經(jīng)滿足的條件,而是將捕獲事件視為在發(fā)生后立即消失的臨時信號。因此,流程只有在事件發(fā)生時恰好處于準備接收狀態(tài)時才能處理該事件。在純功能流程建模中,這些細節(jié)通常會被忽略,但是,在技術(shù)流程建模中必須遵循這些細節(jié)。
如果我們需要等待兩個可能獨立發(fā)生的事件,但是這兩個事件必須在流程繼續(xù)之前發(fā)生,那么我們將表示如圖1.6所示的情況。
圖1.6:使用并行網(wǎng)關(guān)同時等待多個事件
我們可以用bpmn建模附加的中間事件。它們不顯式地需要等待,但它們確實會中斷我們的活動,包括任務(wù)和子流程(稍后將討論)。之所以附加這些中間事件,是因為我們將它們放置在想要中斷的活動的邊界上。在圖1.7中所示的過程中運行的令牌的行為如下:
令牌移到任務(wù)1,相應(yīng)啟動。
如果在處理任務(wù)1時發(fā)生事件1,任務(wù)1將立即取消,令牌將通過異常流轉(zhuǎn)移到任務(wù)3。另一方面,如果事件1沒有發(fā)生,則將處理task 1,令牌將通過常規(guī)序列流轉(zhuǎn)移到task 2。
如果事件1只在任務(wù)1完成后發(fā)生,那么它就不再重要。
圖1.7:事件1取消任務(wù)1并啟動任務(wù)3
由于中間事件不中斷,附加的中間事件不必導(dǎo)致活動被取消。這聽起來很尷尬,但很有用。令牌在圖1.8中所示的process部分中移動,如下所示。
1、令牌移到任務(wù)1,相應(yīng)啟動。
2、如果在處理任務(wù)1時發(fā)生事件1,則克隆令牌。在第二個令牌移動到任務(wù)3時,任務(wù)1繼續(xù)被處理,現(xiàn)在任務(wù)3也被處理了。這個過程甚至可能重復(fù)發(fā)生,也就是說,事件可能多次發(fā)生。每次出現(xiàn)都會導(dǎo)致另一個克隆標記。
3、如果事件1沒有發(fā)生,任務(wù)1將完成,令牌將通過常規(guī)序列流轉(zhuǎn)移到任務(wù)2。
4、如果事件1只在任務(wù)1完成后發(fā)生,那么它就不再重要。
圖1.8:事件1的發(fā)生導(dǎo)致了task 3的啟動,而task 1正在被進一步處理
進程觸發(fā)拋出中間事件。這意味著在這樣的事件中發(fā)生的令牌會觸發(fā)它,然后立即繼續(xù)。拋出事件不會導(dǎo)致活動被取消,這就是它們永遠不能被附加的原因。它們只出現(xiàn)在序列流中。我們已經(jīng)知道了none中間事件,該事件可用于將條目建模為已定義狀態(tài)。這也是一個投擲活動。
在下面的部分中,我們將介紹使用bpmn時使用的事件類型。我們還將解釋如何使用基于事件的網(wǎng)關(guān)對不同事件作出反應(yīng)。事件類型有:
消息
計時器
錯誤
有條件的
信號
終止
鏈接
補償
多個
平行
升級
取消
本文會持續(xù)更新,歡迎關(guān)注,技術(shù)支持:盤古BPM