顯示具有 BPMN 標籤的文章。 顯示所有文章
顯示具有 BPMN 標籤的文章。 顯示所有文章

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。

2011年2月17日 星期四

[BPMN 2.0] Process平行執行的應用

BPMN 本身支援Parallel Gateway讓開發人員能夠平行處理多個Activity,你可以拉出如下圖所示的Process同步處理MyTask1與MyTask2:


這樣的表示方式很簡單,但是我們有時候會遇到另外一個需求,要怎麼在run-time動態產生多條平行執行的流程?照上圖的作法,必須在design time就設計好執行路徑的數量。

和Loop的情形一樣,我們還是可以使用subprocess的方式來處理。

使用subprocess activity,我們可以簡單拉出下示流程:


Double-click subprocess activity,編輯對話框中的Loop Characteristics Tab


平行執行的時候,記得在Loop Characteristics中選擇 "MultiInstance",並且不要勾選最下方的 "Is Sequential" 選項。

此時的 Loop Cardinality 代表你需要動態幾個平行的instance處理,我在此放入了一個變數parallelCount,你可以自行設計如何取得此數值。

2011年1月28日 星期五

[BPMN 2.0] 迴圈的使用

一般來說,由於BPMN Notation是unstructure的表示法,因此不像是BPEL語言,會需要像是While這樣的語法來implement迴圈,通常都是用直接拉回去配合上Exclusive OR的Gateway就可以做到效果:

如上圖所示,就是最基本的迴圈。

BPMN也支援Subprocess Loop的方式來執行迴圈,你可以將需要重複多次執行動作的Activity放在一個subprocess之中,就可以不需要自己去implement上面那些變數的初始化或者是Exclusive OR Gateway了。

下面是個範例:

Subprocess展開前


Subprocess展開後



看起來應該比較簡單了吧?
該怎麼設定迴圈的執行次數,內部變數...等資料呢?

Double-click Subprocess,選擇Loop Characteristics的tab,點選Loop


選擇Loop Condition右手邊的那個小icon打開Express Builder


看一下左邊的Variable區,你會發現你的Subprocess "Loop Demo" 中自動有一個loopCounter的變數,簡單的說,這個變數是扮演一般我們 for-loop 中間的 "i" 的角色。

你就可以和寫for-loop迴圈一樣去指定 loopCounter <= count,來定義迴圈的執行條件了!