「DAY03」理解 BPMN 核心概念:事件

Posted on September 17, 2023 • 1 min read • 203 words
Share via

正式進入到BPMN的零部件學習階段,我們利用大概10分鐘的時間來學習BPMN中的零件「事件」吧。

昨天我們學習BPMN參與者的概念,我們現在已經對BPMN的雛形有初步的了解,今天正式進入到BPMN的零部件學習階段,我們利用大概10分鐘的時間來學習BPMN中的零件「事件」吧。

事件(Event)

事件(Event)在BPMN 2.0執行語義中扮演著極為重要的角色,指的是在流程運行過程中所發生的事情,而這些事情的發生會影響到流程的進行。每個事件通常包括兩個要素,分別是觸發該事件的原因以及其所導致的結果。

事件包含了開始(Start)、中間(Intermediate)和結束(End)三種類型,涵蓋了事件的啟動、結束、邊界條件,以及每個活動的創建、啟動和流轉等過程。透過事件機制,可以透過事件控制器為系統增加輔助功能,例如整合其他業務系統或活動預警等。


基本概念-事件符號

事件的圖形符號呈現為一個圓圈。

開始事件(Start Event)符號是空心圖形,代表著開始事件,代表某事的開始,或流程的啟動,促使第一個活動的執行。

https://ithelp.ithome.com.tw/upload/images/20230917/20163254ay1G72hO6n.png

(圖片來源:Business Process Model and Notation(BPMN))P246

中間事件(Intermediate Event)符號是兩個嵌套的圓圈,位於開始事件與結束事件之間,會影響事件或流程的進展,但不導致事件直接開始或結束。

https://ithelp.ithome.com.tw/upload/images/20230917/20163254VsXntG6xMr.png

(圖片來源:Business Process Model and Notation(BPMN))P250

結束事件(End Event)符號為實心圓,標誌著事件或流程的結束或終止。若它發生在參與者完成可能的活動序列後,通常會標記流程的業務目標達成。

https://ithelp.ithome.com.tw/upload/images/20230917/20163254D7uc9HyxPO.png

(圖片來源:Business Process Model and Notation(BPMN))P272


💡 題外話:上述的事件類型在BPMN2.0中被歸類為None Event類別,屬於沒有定義的事件,詳細請參見:Business Process Model and Notation(BPMN))P272


流程引擎支援五種類型的事件(基礎):

  • 空白事件(None Events)
  • 定時器事件(Timer Events)
  • 訊息事件(Message Events)
  • 信號事件(Signal Events)
  • 條件事件(Conditional Events)

空白事件

「空白事件(None Events)」指的是未明確指定的事件。

舉例來說,「空白開始事件」表示啟動流程實例的觸發方式並未被具體指定,流程引擎無法預測流程實例必須何時被啟動。

https://ithelp.ithome.com.tw/upload/images/20230917/20163254blPxu5MQwe.png

空白事件流程範例1

(圖片來源:筆者自製,使用bpmn.io)

  1. 「空白結束事件」則表示在到達該事件時,所引發的結果未被具體指定。因此,除了結束目前的執行路徑外,引擎不會執行任何其他動作。
  2. 「空白中間事件(拋出)」通常用於指示流程中某個特定狀態的實現。

空白事件流程範例

https://ithelp.ithome.com.tw/upload/images/20230917/20163254DD3gmN1tId.png

空白事件流程範例2

(圖片來源:筆者自製,使用bpmn.io)


定時器事件

定時器事件(Timer Event)用來在特定的日期、時間,或者週期內觸發事件。由預先設定的定時器所觸發的事件,可以用作開始事件、中間事件或者邊界事件,順帶一題,邊界事件可以是中斷式亦或是非中斷式的。


💡 定時器事件 舉例來說

在2023年9月18號00:00 觸發一個事件,事件是觸發鈴響,響鈴30秒後任務結束。

上述對倒數計時事件進行建模。我們需要將定時器事件(Timer Event)建模為附加定時器事件(Attached Timer Event)。可以設定任務的最大執行時間,一旦超時,就會中斷這個任務的執行,轉而執行定時器所觸發的事件。而定時器的事件大概可以分為以下三種型態:

  1. 定時器開始事件 定時器開始事件用來在給定的時間點創建流程實例,可以用於只啟動一次的流程,也可以用於在固定時間間隔內啟動的流程。
  2. 定時器中間捕獲事件 定時器中間捕獲事件主要功用是當執行到達可以捕獲事件的活動時,將啟動定時器,觸發事件完成後(如在指定的時間間隔之後),將沿著離開定時器中間事件的序列流繼續執行。
  3. 定時器邊界事件 定時器邊界事件主要功用是當執行到達具有附加邊界事件(Attached Timer Event)的活動時,將啟動定時器。當定時器觸發時(如在指定的時間間隔之後),活動被中斷,並沿著離開定時器邊界事件的序列流繼續執行。

中斷定時器事件和非中斷定時器事件之間有區別。中斷事件是預設的,會導致原始活動被中斷。而非中斷事件不會導致原始活動被中斷,活動保持不變。相反,會創建一個新的執行並發送給事件的傳出序列。

定時器事件流程範例

範例一(常見定時器用法) 💡 無須考慮吃飯的地點 中午11點,選購午餐訂購外送,如果同事挑選到12點都沒有選到合適的店家,那就直接走到公司隔壁的快餐店店裡吃午餐。

https://ithelp.ithome.com.tw/upload/images/20230917/20163254XvVsz9lJ6B.png

定時器事件流程範例1

(圖片來源:筆者自製,使用bpmn.io)

範例二(非中斷定時器用法)

已在公司為例,在開會前可以設定一個定時器,在開會前15分鐘,當時間到了就開始準備會議室,我們試著做做看這個案例。

https://ithelp.ithome.com.tw/upload/images/20230917/20163254RnS97PArcL.png

定時器事件流程範例2

(圖片來源:筆者自製,使用bpmn.io)


訊息事件

訊息事件(Message Event)是引用指定訊息的事件(單向),而訊息(Message)是用來承載參與者雙方溝通的內容,訊息有名稱和有效負載(Payload)。

1.訊息開始事件

訊息開始事件通過訊息來啟動流程實例。這使得可以從一組可選的開始事件中選擇正確的開始事件。當部署具有一個或多個訊息開始事件的流程定義時,需考慮以下事項: (1)訊息開始事件的名稱在給定的流程定義中必須是唯一的。若兩個或多個訊息開始事件引用同一訊息,或者引用同名的訊息,則在部署流程定義時引擎會拋出異常。 (2)在部署新版本的流程定義時,取消之前版本的訊息訂閱,對於新版本中不存在的訊息事件也是如此。一個流程可以有多種不同的訊息開始事件,以回應不同的訊息,最終選擇其中一種來啟動,這在某些情況下非常有用。

2.訊息中間捕獲事件

當令牌到達訊息中間捕獲事件時,在那裡等待,直到收到正確名稱的訊息為止。必須通過適當的API調用將訊息傳遞給流程引擎。

3.訊息邊界事件

邊界事件一般用於捕獲附加到活動邊界的事件。這意味著當活動運行時,訊息邊界事件將監聽其註冊的具名訊息。當捕獲到這種情況時,根據邊界事件的配置,可能會發生以下兩種情況。 (1)中斷型邊界事件:活動被中斷,並沿著離開事件的序列流繼續執行。 (2)非中斷型邊界事件:已有令牌繼續保留在活動中,同時創建新的令牌,新令牌沿著離開事件的序列流繼續執行。

4.訊息中間拋出事件 訊息中間拋出事件可以向外部服務發送訊息。此事件的行為與服務任務相同。

5.訊息結束事件 當流程執行到訊息結束事件時,當前的執行路徑將結束,並發送一則訊息。訊息結束事件的行為與服務任務相同。

範例一 、網購簡單情境(單向)

顧客在網上選購商品後下訂單,然後等待收貨通知。當顧客收到快遞送達的訊息後,便前去收貨。訊息中間事件也可能導致當前執行的事件被取消。

https://ithelp.ithome.com.tw/upload/images/20230917/20163254nXyj8pmV4c.png

訊息事件流程範例1

(圖片來源:筆者自製,使用bpmn.io)

範例二、網購簡單情境(多向)

流程可以同時具有多種不同的訊息開始事件。

https://ithelp.ithome.com.tw/upload/images/20230917/20163254Xk0YceZjKJ.png

訊息事件流程範例2

(圖片來源:筆者自製,使用bpmn.io)

範例三、網購簡單情境(中間捕獲事件)

一個流程模型中可以包含中間捕獲事件,等待指令。

https://ithelp.ithome.com.tw/upload/images/20230917/201632544tscY9kEUu.png

訊息事件流程範例3

(圖片來源:筆者自製,使用bpmn.io)

除了使用訊息中間捕獲事件外,可以與邊界事件結合使用,也可考慮使用接收任務實現類似業務目的。

範例四 、網購簡單情境(訊息邊界事件)

消息中間拋出事件「發送訂單郵件」,可以向外送服務發送消息,事件具有與服務任務相同的行為。

https://ithelp.ithome.com.tw/upload/images/20230917/20163254aSZ9MIbpZl.png

訊息事件流程範例4

(圖片來源:筆者自製,使用bpmn.io)

信號事件

信號事件(Signal Event)是引用指定信號的事件,在流程中傳遞信號(Signal)時,會觸發信號事件。不同於消息,信號沒有特定的接收目標,信號就像是廣播電台的形式,一旦信號被廣播出去,多個參與者可以接收並觸發多個流程執行。

  1. 捕獲信號事件 (1)信號開始事件:使用指定的信號啟動流程實例。 (2)信號中間捕獲事件:當令牌到達信號中間捕獲事件時,將等待到具有正確名稱的信號才會進入下一步。 (3)信號邊界事件:當執行到達附加了信號邊界事件的活動時,信號邊界事件將捕獲相應的信號。
  2. 拋出信號事件 (1)信號中間拋出事件:信號中間拋出事件用於拋出定義的信號事件,將廣播(同步或異步)給所有活動的處理程序。 (2)信號結束事件:信號結束事件用於拋出定義的信號事件,並結束當前的執行路徑。 (3)傳遞變數:可以將流程變數從發送信號的流程實例傳遞到所有捕獲信號的流程實例。

範例一、IG發文轉發

舉例來說,現在就像網紅MrBeast生日送錢,只要公開轉發限動就可以獲得抽獎資格,所以我們現在要來判斷自身的IG帳號是否可以發限動,如果可以我們就在相對應的位子進行轉發。

https://ithelp.ithome.com.tw/upload/images/20230917/20163254H0N6uLDPXv.png

信號事件流程範例1

(圖片來源:筆者自製,使用bpmn.io)

💡 信號事件是引用特定信號的事件。信號是全局範圍的事件(廣播語義),並傳遞給所有活動的處理程序。


條件事件

條件事件(Conditional Event)是在特定條件成立時觸發的事件,條件事件與流程獨立,因此只能捕獲事件,而且一個條件事件無法觸發另一個條件事件。

  1. 條件邊界事件 條件邊界事件的作用類似於觀察者:當特定條件滿足時將被觸發,默認為中斷事件,導致原始活動被中斷,而非中斷事件不中斷原始活動,實例仍處於活動狀態。相反地,系統會創建一個額外的執行路徑,以獲取事件的輸出轉換,只要連接的活動處於活動狀態,可以多次觸發非中斷條件事件。

  2. 中間條件捕捉事件 中間條件事件類似於等待,持續等待直至條件滿足。當執行到捕捉事件活動時,將開始評估條件。如果條件滿足,流程將繼續執行至下一個活動。如果條件不滿足,執行將停留在此活動中,直到條件滿足為止。

  3. 條件開始事件 條件開始事件可以透過評估某些條件來啟動流程。一個流程可以有一個或多個條件開始事件。如果滿足一個以上的條件,將觸發相應數量的流程。

  4. 事件子流程的條件開始事件 與條件邊界事件類似,事件子流程的條件開始事件可以是中斷型的,也可以是非中斷型的。

  5. 觸發條件事件 (1)作用域實例化時觸發。 (2)透過變數 API 觸發。

範例一、製作蛋糕烘烤階段

以烤箱製作蛋糕為例,不考慮蛋糕體前期準備過程,直接進入。第一步我們需要將烤箱預熱,當烤箱達到預熱溫度200度,放入蛋糕體進行烘焙,待12分鐘烘焙後,取出蛋糕,完成整個烘焙過程。

https://ithelp.ithome.com.tw/upload/images/20230917/20163254ykoTFJLFrZ.png

條件事件流程範例1

(圖片來源:筆者自製,使用bpmn.io)

條件事件定義了一個事件,在特定條件的評估結果為真時觸發該事件,可以用作事件子流程的開始事件(中斷/非中斷)、中間事件和邊界事件(中斷/非中斷)。

💡 在流程實例的整個執行過程中,可以取消流程。如果滿足條件開始事件的條件,則流程實例的執行將被事件子流程中斷,並取消當前處理中的流程。


補充事件種類

錯誤事件

錯誤事件(Error Event),在任何流程中,都可能出現意外狀況,我們可以在設計流程時,先考慮可能出現的錯誤情況,然後採取適當的措施來處理。另外,我們也可以選擇將錯誤事件升級,交由上層系統來處理。

升級事件

升級事件(Escalation Events)就如其名,是指涉及已命名升級(Escalation)的事件。主要用於子流程與上層流程之間的溝通。與錯誤事件不同,升級事件並非關鍵事件,它會在拋出的位置繼續執行。

取消事件

取消事件(Cancel Events)只在建模交易子流程時使用,有兩種變體:捕獲中間事件和結束事件。

補償事件

補償事件(Compensation Events)包括中間拋出補償事件、補償結束事件和補償邊界事件,用於執行特定活動或範圍的補償。

連結事件

連結事件(Link Events)不具有特定的執行語義,僅被視為指向同一流程模型(在同一子流程中)中另一個節點的「前往」語句。因此,我們可以將兩個相符的連結視為序列流的替代方式。連結事件的概念就像是一個「跳轉至」指令,讓流程可以流向同一子流程中的另一個位置。

終止事件

終止事件(Terminate Event)在某些情況下十分實用,當我們需要同時執行多個任務,但其中一個任務完成後,其他同時執行的任務便可停止。這時候,我們可以引入「終止事件」來達成目的。

由於篇幅的關係,筆者僅寫入部分事件,如果想要看到更完整的內容,詳細請參見:[Business Process Model and Notation(BPMN)](https://www.omg.org/spec/BPMN/2.0/PDF)

小結

所提到的事件,主要根據其觸發方式進行分類。BPMN 2.0 也從另一個角度對事件進行區分。例如,開始事件只能對觸發器作出回應,也就是捕捉(Catch)一個(觸發的)事件。相反地,結束事件只能帶來一個結果,或者說拋出(Throw)一個(異常的)結果。然而,對於中間事件,既可以觸發,也可以捕捉另一個觸發器事件。根據這個特性,可以組合出許多錯綜複雜的事件。

https://ithelp.ithome.com.tw/upload/images/20230917/20163254e8LPFmN9Sw.png

(圖片來源:Business Process Model and Notation(BPMN))P261

我們現在已經知道在BPMN中的事件,恭喜您對BPMN有「事件」的運用有所了解,明天我們再利用一些認識BPMN中的「任務」,我們一起加油吧~~

💡 如果有任何問題,歡迎在下方留言!! 筆者頭一回寫技術文,如果內容有誤,或者內容的呈現上有所缺陷,如果您願意,歡迎在下方留言給我呦~~

anything.best

這是我的部落格,歡迎點擊閱覽喔~~會不定期更新文章

Follow me

I work on everything coding and tweet developer memes