土製狀態機在工作流引擎中的應用

2021-09-23 22:52:17 字數 3103 閱讀 2326

/**

* @author : ahuaxuan

* @date 2009-10-27

*/ 很早之前(應該是一年以前),ahuaxuan在用dfa實現文字過濾一文中使用確定有限自動機實現了詞典的高速查詢。其實在當時那段時間裡,由於對狀態機有了一定的研究,ahuaxuan也觸類旁通的理解了工作流引擎的核心體制。於是當時就用python寫了乙個小巧的工作流引擎的示例,在這之前ahuaxuan沒有看過任何工作流引擎的實現,該實現純屬思維的自我延伸。

現在我來說說我的實現。

狀態機的本質是狀態的遷移,即從a狀態+某個動作===》b狀態。到這裡我們還要來看看這張圖。

從這張圖中我們可以看到,狀態(大寫字母)+動作(小寫字母)可以到達新的狀態。那麼對於程式設計師來說,我們要做的就是將這種機制用程式表達出來。比如說我們最常想到的是什麼?矩陣!

這很好理解,但是對於工作流引擎來說,由於狀態的遷移涉及到:當前狀態+動作+條件===》新狀態。

所以用二維的矩陣無法表示出這種邏輯。那麼我們可以將矩陣中的元素替換為條件陣列。

這樣,我們可以通過當前狀態+動作得到乙個條件陣列,然後再遍歷這個條件陣列,條件陣列中的元素即是條件和滿足條件的下乙個狀態(雖然本質上是乙個三維陣列,但是在這裡還是看成矩陣+陣列元素比較符合邏輯)。

這裡需要畫乙個圖,乙個矩陣,矩陣中的元素是乙個條件陣列

沒錯,這是一種方案,但是這裡有乙個問題,那就是每次做狀態遷移的時候,我們必須知道某個狀態在矩陣一維上的index,已經某個動作在矩陣二維上的index.有了這兩個index我們才能得到條件陣列。所以這裡還有乙個繁瑣的轉換操作操作。來看一段偽**:

1.conditions = matrix[getstatusindex[『a』], getactionindex[『a』]]  

2.for condiction in conditions:

3. if condition match input:

4. return condition.nextstatus

核心流程大概就是這樣,當

那麼除了矩陣這種資料結構,我們還有其他的資料結構可以用來表示: 「當前狀態+動作+條件===》新狀態」嗎。

當然有,那就是使用樹結構。在了解了三維陣列的實現之後,再來看樹實現,應該和容易了,那就直接上圖, 將上圖的矩陣轉換成樹結構之後,我們可以得到如下的樹結構。

那現在我們來審視一下現在的問題,打個比方,我們現在手裡有兩張牌,一張是狀態a,一張是動作a,我們如何通過這兩種牌來得到條件集合呢,最簡單的方法是首先遍歷第二層節點,找到a,然後再遍歷a的子節點,找到a。通過兩次for迴圈找到了條件集合,而條件集合中包含著下乙個狀態。

那麼有沒有更簡單更快速的方式可以直接找到條件集合,而直接跳過兩次遍歷呢。有,ahuaxuan的想法是tree+hash.也就是通過a的hash值,我們可以直接找到tree上的a節點。然後再通過a的hash值,我們可以直接找到a的子中的a節點。得到a節點之後我們就可以條件集合。那麼我們可以用什麼樣的資料結構來實現乙個這樣的模型呢。這裡面有hash運算,那麼我們首先選擇hashmap來建立這麼一顆樹。

我們來看一下這個定義: 

map>>> dfa。
那麼我們如何根據a,和a來得到乙個條件集合呢? 

dfa.get[「processname」].get[「a」].get[「a」]
通過這樣的方式,我們就可以根據當前狀態和當前的動作得到乙個條件集合。然後遍歷這個條件集合就是找到滿足「輸入「的條件,該條件會指向下乙個狀態。

我們來看一下**實現:

首先我們來構造這麼乙個狀態機: 

1.private void constructdfa(listprocesslist)   

15.

16. smap.put(string.valueof(action.getname()), transitions);

17. }

18.

19. }

20. }

21. }

接著我們來看看如何根據這個狀態機來做狀態遷移: 

1.public string getnextstate(string processname, string stateid, string actionid, mapconditions)   

9. }

10.

11. stringbuilder sb = new stringbuilder();

16.

17. throw new workflowstateexception(sb.tostring());

18. }

1.for state in states:  

2. if state.name == inputstatename:

3. for action in state.actions:

4. if action.name == inputactionname:

5. for transition in action.transitions:

6. …………………………………………………………………

通過這種方式,使用者傳入inputstatename和inputactionname, osworkflow得到了一組transition,並根據條件選擇某個transition, 這樣也實現了狀態的轉移。

從這裡面可以看出,osworkflow是利用廣度優先的原則,先找到符合條件的state,然後再找到符合條件的action,以此類推。

說到這裡,通過這種狀態機實現工作流引擎的方式基本的完全的,較為清晰的呈現在我們眼前了。

未完待續 

c 版本工作流引擎狀態機(2)

由於公司的產品面向集團企業提供合同管理與法律事務管理,涉及的組織層級複雜,業務流轉環節多樣。不可能使用單一路徑流程進行處理。在審批過程中,需要及時響應外部約束條件的變化,團隊引入狀態機工作流引擎模型。基於狀態控制流程流轉,在流程例項級別提供了執行中,完成,暫停,作廢等外部狀態,並根據引擎需要,定義了...

宿主中操作狀態機工作流的狀態

從引擎中得到狀態機例項 建構函式 dim狀態機例項 as statemachineworkflowinstance 狀態機例項 new statemachineworkflowinstance me.引擎,me.當前操作的例項.instanceid 得到工作流的狀態列表 states 集合 下拉列表...

WF工作流中什麼是狀態機工作流和順序工作流

什麼是工作流,工作流可以說是對業務處理過程的建模,當我們設計工作流的時候,我們首先要分析業務處理過程中要經歷的步驟。然後,我們就可以利用wf建立工作流模型來模擬業務的處理過程。wf工作流包含兩種型別的工作流 順序工作流和狀態機工作流。順序工作流提供了一系列有組織的步驟,一般情況下,步驟是逐一執行的。...