2011年2月22日 星期二

[BPMN 2.0] 例外狀況處理

這一篇我們來看看在BPMN中怎麼處理例外狀況。

有一個假定的場景:我們設計一個自動處理的流程,在一般情形時都透過系統自動將資料處理並轉發至Message Queue之中,但是在某些情況之下,當自動發送訊息無法正常處理時,系統會發一筆人工作業單給特定例外狀況處理人員,此人員必須在30分鐘之內手動處理,不然系統會通知其管理人員。

這算是一個簡單整合系統自動流程與人工作業流程的範例,我們先看一下BPMN怎麼畫出這樣的流程:


圖中有三個水道,第一個水道代表了系統自動執行的流程,第二與第三水道分別代表了例外狀況處理人員以及管理人員的角色。我們可以在 "Send Msg" Service Activity 與 "Handle Exception" User Task上面看到了兩個我們用來處理特定事件(Event)的圖示,產生的方式是你可以從Component Palette --> Events --> Catch Events中分別拖拉出 "Error" 與 "Timer" 兩個Event放到Activity之上。

長相像是閃電的 "Catch Error" Event 顧名思義就是用來抓取該 Activity 錯誤發生之時的執行路徑,Double-Click該Event你可以看到如下圖所示的對話框:


在此對話框之中,你可以選擇其處理哪些種類的例外,概念和一般程式語言的catch很像,可選擇抓取特定的某種Exception,或是所有的Business與System的Exception。在我們設計的例子中,由於此Activity是屬於系統自動處理步驟,我們設計抓取其所發生的所有系統例外。

接下來Double-click長相像是時鐘的Timer Event,其對話框如下所示:



當Timer Event被放置在某一Activity之上時,代表了此Activity每當特定時間或每隔特定時間會驅動一個事件執行,我們選擇了 "Time Cycle" 並指定 Cycle Time 為 30分鐘,因此,當流程在此Activity上停留超過30分鐘之後,此事件會被驅動。

特別注意的是,你可以根據需求決定需不需勾選 "Interrupting Event",勾選此選項代表當事件被驅動之後,此Activity會被打斷,直接將流程進入Event驅動執行的流程;但若是不勾選的話,事件仍然會被驅動,只是該流程可由該Activity繼續向下執行。

當然,搭配上subprocess之後,你可以用此處理一連串的 Activity :


如圖,你可以針對Step1至Step3處理超過時間之時,執行StepN。