OSWorkflow
OSWorkflow概況
OSWorkflow是一個靈活的工作流引擎,可嵌入到企業應用程序中。它提供了許多的持久化API支持包括:EJB,Hibernate,JDBC和其它。OSWorkflow還可以與Spring集成。在商用和開源世界里,OSWorkflow 都不同于這些已有的工作流系統。最大不同在于 OSWorkflow 有著非常優秀的靈活性。
OSWorkflow的優勢
OSWorkflow 給你絕對的靈活性。OSWorkflow 被認為是一種“低級別”工作流實現。與其他工作流系統能用圖標表現“Loops(回路)”和“Conditions(條件)”相比,OSWorkflow 只是手工“編碼(Coded)”來實現的。但這并不能說實際的代碼是需要完全手工編碼的,腳本語言能勝任這種情形。OSWorkflow 不希望一個非技術用戶修改工作流程,雖然一些其他工作流系統提供了簡單的 GUI 用于工作流編輯,但像這樣改變工作流,通常會破壞這些應用。所以,進行工作流調整的最佳人選是開發人員,他們知道該怎么改變。不過,在最新的版本中,OSWorkflow 也提供了 GUI 設計器來協助工作流的編輯。OSWorkflow 基于有限狀態機概念。每個 state 由 step ID 和 status 聯合表現(可簡單理解為 step 及其 status 表示有限狀態機的 state)。一個 state 到另一 state 的 transition 依賴于 action 的發生,在工作流生命期內有至少一個或多個活動的 state。這些簡單概念展現了 OSWorkflow 引擎的核心思想,并允許一個簡單 XML 文件解釋工作流業務流程。
OSWorkFlow核心概念
概念定義
步驟(Step) 一個 Step 描述的是工作流所處的位置。可能從一個 Step Transtion(流轉)到另外一個 Step,或者也可以在同一個 Step 內流轉(因為 Step 可以通 Status 來細分,形成多個State)。一個流程里面可以多個Step。狀態(Status) 工作流 Status 是用來描述工作流程中具體Step(步驟)狀態的字符串。OSWorkflow 的有 Underway(進行中)、Queued(等候處理中)、Finished(完成)三種 Status。一個實際State(狀態)真正是由兩部分組成:State = (Step + Status) 。
流轉(Transtion) 一個State到另一個State的轉移。
動作(Action) Action 觸發了發生在 Step 內或 Step 間的流轉,或者說是基于 State 的流轉。一個 step 里面可以有多個Action。Action 和Step 之間的關系是,Step 說明“在哪里”,Action 說明“去哪里”。 一個 Action 典型地由兩部分組成:可以執行此Action(動作)的 Condition(條件),以及執行此動作后的 Result(結果)。
條件(Condition)類似于邏輯判斷,可包含“AND”和“OR”邏輯。比如一個請假流程中的“本部門審批階段”,該階段利用“AND”邏輯,判斷流程狀態是否為等候處理中,以及審批者是否為本部門主管。
結果(Result) Result 代表執行Action(動作)后的結果,指向新的 Step 及其 Step Status,也可能進入 Split 或者 Join。Result 分為兩種, Contidional-Result (有條件結果),只有條件為真時才使用該結果,和 Unconditional-Result(無條件結果),當條件不滿足或沒有條件時使用該結果。
分離/連接(Split/Join)流程的切分和融合。很簡單的概念,Split 可以提供多個 Result(結果);Join 則判斷多個 Current Step 的態提供一個 Result(結果)。
步驟、狀態和動作(Step, Status, and Action)
工作流要描述步驟(Step)、步驟的狀態(Status)、各個步驟之間的關系以及執行各個步驟的條件和權限,每個步驟中可以含有一個或多個動作(Action),動作將會使一個步驟的狀態發生改變。對于一個執行的工作流來講,步驟的切換是不可避免的。一個工作流在某一時刻會有一個或多個當前步驟,每個當前步驟都有一個狀態值,當前步驟的狀態值組成了工作流實例的狀態值。一旦完成了一個步驟,那么這個步驟將不再是當前步驟(而是切換到一個新的步驟),通常一個新的當前步驟將隨之建立起來,以保證工作流繼續執行。完成了的步驟的最終狀態值是用Old-Status屬性指定的,這個狀態值的設定將發生在切換到其他步驟之前。Old-Status的值可以是任意的,但在一般情況下,我們設置為Finished。
切換本身是一個動作(Action)的執行結果。每個步驟可以含有多個動作,究竟要載入哪個動作是由最終用戶、外部事件或者Tiggerd的自動調用決定的。隨著動作的完成,一個特定的步驟切換也將發生。動作可以被限制在用戶、用戶組或當前狀態。每一個動作都必須包含一個Unconditional Result和0個或多個Conditional Results。
所以,總體來說,一個工作流由多個步驟組成。每個步驟有一個當前狀態(例如:Queued, Underway or Finished),一個步驟包含多個動作。每個步驟含有多個可以執行的動作。每個動作都有執行的條件,也有要執行的函數。動作包含有可以改變狀態和當前工作流步驟的results。
結果、分支和連接(Results, Joins, and Splits)
無條件結果(Unconditional Result) 對于每一個動作來講,必須存在一個Unconditional Result。一個result是一系列指令,這些指令將告訴OSWorkFlow下一個任務要做什么。這包括使工作流從一個狀態切換到另一個狀態。有條件結果(Conditional Result) Conditional Result是Unconditional Result的一個擴展。它需要一個或多個Condition子標簽。第一個為true的Conditional(使用AND或OR類型),會指明發生切換的步驟,這個切換步驟的發生是由于某個用戶執行了某個動作的結果導致的。
三種不同的Results(conditional or unconditional) 一個新的、單一的步驟和狀態的組合。一個分裂成兩個或多個步驟和狀態的組合。將這個和其他的切換組合成一個新的單一的步驟和狀態的組合。每種不同的result對應了不同的xml描述,你可以閱讀http://www.opensymphony.com/osworkflow/workflow_2_7.dtd,獲取更多的信息。注意:通常,一個split或一個join不會再導致一個split 或 join的發生。
自動步驟(Auto actions)
有的時候,我們需要一些動作可以基于一些條件自動地執行。為了達到這個目的,你可以在action中加入auto="true"屬性。流程將考察這個動作的條件和限制,如果條件符合,那么將執行這個動作。 Auto action是由當前的調用者執行的,所以將對該動作的調用者執行權限檢查。整合抽象實例(Integrating with Abstract Entities)
建議在你的核心實體中,例如"Document" 或 "Order",在內部創建一個新的屬性:workflowId。這樣,當新的"Document" 或 "Order"被創建的時候,它能夠和一個workflow實例關聯起來。那么,你的代碼可以通過OSWorkflow API查找到這個workflow實例并且得到這個workflow的信息和動作。工作流實例狀態(Workflow Instance State)
有的時候,為整個workflow實例指定一個狀態是很有幫助的,它獨立于流程的執行步驟。OSWorkflow提供一些workflow實例中可以包含的"meta-states"。這些"meta-states"可以是CREATED, ACTIVATED, SUSPENDED, KILLED 和 COMPLETED。當一個工作流實例被創建的時候,它將處于CREATED狀態。然后,只要一個動作被執行,它就會自動的變成ACTIVATED狀態。如果調用者沒有明確地改變實例的狀態,工作流將一直保持這個狀態直到工作流結束。當工作流不可能再執行任何其他的動作的時候,工作流將自動的變成COMPLETED狀態。然而,當工作流處于ACTIVATED狀態的時候,調用者可以終止或掛起這個工作流(設置工作流的狀態為KILLED 或 SUSPENDED)。一個終止了的工作流將不能再執行任何動作,而且將永遠保持著終止狀態。一個被掛起了的工作流會被凍結,他也不能執行任何的動作,除非它的狀態再變成ACTIVATED。