1. 程式人生 > >工作流系統之二十九 詳解工作流例項的一次流轉

工作流系統之二十九 詳解工作流例項的一次流轉

通常在利用流程設計器給業務流程建模之後,會生成一個流程描述的xml檔案,業務流程的每個環節步驟,需要執行的操作,自動的,手動的等等資訊,都被描述在這個流程建模的xml檔案中。xml檔案的內容,是一些規則的預先定義的抽象的節點資訊,流程引擎負責這些節點的定義,建立,解釋,定位等等,業務流程利用這些節點建模。建模完成的業務流程,掛接上業務表單後,就可以直接執行業務流程了。

業務流程的執行,從啟動流程例項開始,啟動一個流程例項即代表開始了一次業務流程處理。每例業務流程的處理過程,都包含從建立,到啟用,到處理,到結束(當然中間也可以人為的直接終止,或掛起,再恢復),這樣一個過程。流程例項建立後,就按照流程建模的xml檔案,按照定義的節點路由順序一步一步的流轉,相應業務也在相應的步驟中處理。


流程例項按照節點路由順序,每執行一次,代表一次流轉。每次的流轉包含流程節點的狀態升遷和辦理業務資料的提交,通過工作流的事務,控制這些狀態升遷和業務資料達到同步和一致性。一旦這個流程例項結束了或意外終止了,都代表業務辦理完成了,就再也不能再次發生流轉了。


工作流例項的一次流轉,會涉及到流程節點狀態的升遷和辦理業務資料的提交。
下面示意圖,抽取流程一次流轉的定義示意:從步驟A環節-》到達步驟B


當流程例項到達步驟A的時候,當前流程例項的狀態=步驟A+步驟A的狀態,當執行動作A的時候,通過 動作A的 結果導向 步驟B。當到達步驟B的時候,當前流程例項的狀態=步驟B + 步驟B的狀態。流程例項的狀態通過執行動作A達到了升遷,當在動作A上面綁定了業務表單,業務資料也隨著動作A的執行一起提交。業務資料的提交和流程狀態的升遷是在同一個事務中的,保證資料的一致性。

從上面的分析可以看出,流程的一次流轉涉及到如下圖中紅色框中選中的部分。為什麼步驟A和步驟B會分別是一半呢,下面我們來詳細說明,流轉過程中,每個流程基本元素的流轉順序。

 


在工作流系統的基本元素中,有一些前置後置函式,可以掛接到流程的節點上。當流程例項到達這個節點的時候,會觸發前置函式,離開這個節點會觸發後置函式,就象事件一樣。事件的內容是可以自己任意發揮的,就像一個button的點選函式一樣,點選後做什麼事情,有編寫程式的人來編寫程式碼。這裡的前置後置函式也是一樣,當觸發了前置後置函式後,內容可以是預置的一些系統函式,也可以是業務流程建模者自定義做的一些業務模組,體現流程的擴充套件性。

 

上圖中只描述了動作的前置後置,步驟的前置後置,實際上動作的結果,也有前置後置函式,便於做擴充套件用。實際上可以引入業務模組的不僅是前置後置函式,動作的可執行條件也可以引入業務規則的判斷。例如一個請假的流程,在稽核請假是否通過時,可以引入一個判斷規則,將請假申請人的總年假-已經休的假期=可休年假天數,再和當前申請的天數比較,如果大於則申請通過,否則不通過。

 
綜合上面的描述,我們可以看出流程的一次流轉的先後順序為:

 步驟的後置函式-》動作的前置函式-》完成本步驟的任務-》檢查動作結果中的條件(不成立則無條件結果)-》動作結果的前置-》 建立新的當前步驟(執行新步驟的前置函式)-》  動作結果的後置-》 動作的後置函式
 
 因為執行動作後,會離開本步驟,所以首先是從本步驟的後置函式開始的。
 其中,建立新的當前步驟,關聯到任務資訊,所以也有個處理過程順序:
 
本步驟標記完成,轉到歷史步驟-》下一步為當前步驟-》關閉當前步驟的所有未完成的任務-》到達新步驟,先生成新步驟的所有任務-》再執行新的當前步驟的前置函式。


業務流程在建模的時候,可以利用一些流程的上下文中的變數等做一些控制,也可以引入一些關鍵的業務資料做判斷用。這涉及到流程的持久變數和臨時變數。


例如,獲取當前流程例項的建立者,作為一個變數,傳遞給接下來的第一個步驟作為第一個步驟任務的參與者。
這可以用一個流程的臨時變數來處理:

在流程初始化動作(或動作結果)的前置函式中,將當前流程例項的建立者儲存到變數caller中。然後在下一步驟的任務參與人中,就可以引入caller變數,獲取他的值了。

因為caller變數是個臨時變數,僅存在於流程的一次流轉的中。當流程的這次流轉結束了,這個變數就實效了。就像一個子函式一樣,在子函式的開始,給變數caller賦值,在接下來的程式碼中就可以獲取這個變數的值了。

所以在用流程的臨時變數時候,通常都是在相應節點的前置函式中,給變數賦值,按照流程的流轉順序,在相應的後置節點中獲取變數的值。

同樣的方式還適用於mostRecentCaller,mostRecentOwner 這兩個變數,獲取指定步驟的執行者和獲取指定步驟的所有者,這兩個變數都屬於發生了的歷史步驟才能獲取到。

流程的持久化變數,就與臨時變數不一樣了,只要流程的任意節點中儲存了值,在後續的任意節點中都可以獲取到值。這個不侷限於流程的一次流轉,流程多次流轉都可以。只要在任意一次流轉中儲存了變數的值了,後續的任意流轉中就都可以取值了。

例如一個報銷流程中,報銷申請是否通過,稽核人將這個結果作為一個持久化的變數儲存到流程中了。則在申請人檢視稽核結果的環節,就可以取出這個稽核結果了。稽核的那次流轉,和檢視環節,這是流程的兩個環節。不是流程的一次流轉,但是稽核的那次流轉,必須先於檢視環節,先將變數的值持久化進去,然後後續的環節就能獲取值了。