歡迎與我交流(yun15291li@hotmail.com)
在這篇文章中,主要介紹osworkflow的核心概念以及重要的部分,讓大家對osworkflow有個比較全面的熟悉。
在osworkflow中最最核心的東西就是工作流定義的xml文件。盡管它并不是一定要定義成xml文件。但是xml格式是一種標準的通用的格式。
這個xml文件為某一個給定的工作流進行描述steps、states,transitions,和functionality。下面闡述一下此xml的一般規則:
1、 一個工作流由多個steps組成
2、 對于每個step,可以包括多個actions。一個action可以被設置成自動運行或者需要通過人工交互才可以運行。
3、 每個action都要包括至少一個unconditional result和0或多個conditional results。
4、 假如設定了多個concitioanl results,所有當中的第一個將被執行,假如沒有設定conditional results或者沒有conditions滿足,那么執行unconditional result
5、 一個result過后可能依舊停留在當前的step中,一個新的step,一個split,一個join。在所有的情形中,工作流的state跟著變化(例子工作流中的states分別為:Underway,Queued,和finished)
6、 假如一個result引起一個split,這個result會指定split的屬性,以指向一個split元素。
7、 一個split可以有一個或者多個unconditional results,但是沒有conditional results。Unconditional results。Unconditional results需要指定steps。
8、 一個PRopertyset是一個持久層數據的map,在全局應用中都是可用的。
9、 還有一種叫做transientVars的map,它只存活于一個工作流調用過程中的一定的生命周期,它將會對所有functions和conditions,包括所有的registers,user input,以及工作流上下文狀態等起作用。
工作流概念:
下面開始理解osworkflow的核心概念:
對于step,status,actions部分就不多說明了,其實我覺得理解概念的最快方法應該是參照實例,即使我們不能用高高大大的詞匯描繪出來,能自己理解是什么意思就可以了。
Unconditional result 和 conditional results
這里做以簡單介紹,對于每個action,要求至少存在一個Unconditional result,一個result也就是通過一系列指示來告訴osworkflow下一步的任務是干什么。這種調用使得產生變遷進而從一個state到另外一個state。這種概念是在UML的狀態機里有講,希望了解狀態機相關概念的可以到UML相關書籍中查看。
Conditional result是unconditional result的一種擴展。不同的地方在于他需要一些子元素:condition。用and 和 or來標志各個condition之間的關系。
Conditional 和unconditional 的最終result可以產生三種效應或者說是結果:
1、 一個新的step/status
2、 一個split,出現一或多個step/status
3、 一個join,一個新的step/status
普遍的,一個split或者join不能result出另外一個split或join。
一個step/status result可以按下面方式簡單的設定:
<unconditional-result old-status="Finished" step="2"
status="Underway" owner="${someOwner}"/>
從一個state split 到多個 states可以按以下方式達到:
<unconditional-result split="1"/>
...
<splits>
<split id="1">
<unconditional-result old-status="Finished" step="2"
status="Underway" owner="${someOwner}"/>
<unconditional-result old-status="Finished" step="2"
status="Underway" owner="${someOtherOwner}"/>
</split>
</splits>
Joins是比較復雜的用例。一個典型的join看起來大致如下:
<!-- for step id 6 ->
<unconditional-result join="1"/>
...
<!- for step id 8 ->
<unconditional-result join="1"/>
...
<joins>
<join id="1">
<join id="1">
<conditions type="AND">
<condition type="beanshell">
<arg name="script">
"Finished".equals(jn.getStep(6).getStatus()
&& "Finished".equals(jn.getStep(8).getStatus())
</arg>
</condition>
</conditions>
</join>
<unconditional-result old-status="Finished" status="Underway"
owner="test" step="2"/>
</join>
</joins>
上面這段代碼中最需要關心的就應該是jn。當join實際發生的時候,這個非凡的變量jn可以被用來建立表達式。本質上,可以很輕易理解出這個段xml的意思就是:當step6和8都finish時候在此處進行join。
Functions部分:
Osworkflow用function來定義商業邏輯和一些需要定義執行的服務。用functions標簽來表示。
兩種functions(pre和post)
Pre 是在工作流進行某個變遷之前需要被執行的。一個比較好的例子:為了在result中state變更產生,而先建立caller。
Post是在之后執行的。如當某一個state改變后,發送一email到某處。
Functions可以在兩個分別的地方被指定:steps和actions。
Trigger Functions
Validators
Registers
一個function:用來返回一個用以被其他普通對象能夠輕易訪問得到的對象。尤其是指workflow 的實體類。返回的對象類型不閑典型的例子如:document,metadata,issue,task等。非常便利。
<registers>
<register name="doc" class="com.acme.DocumentRegister"/>
</registers>
...
<results>
<result condition="doc.priority == 1" step="1" status="Underway"
owner="${someManager}"/>
<unconditional-result step="1" status="Queued"/>
</results>
Conditions
變量
授權與限權
自動執行的action
設置auto=true
Common and global actions:
Common和globalactions的主要作用在于在工作流定義文件中能夠避免代碼重復。
基本思想就是簡單。這兩種actions是在最開始就進行說明的,在initial-actions元素后面。
這兩處還不能完全理解好!
Common actions:在最開始定義好,可以在其他地方如此引用
<common-action id="100" />
例如一個“send mail”的action
Global actions:不同之處在于顯式的被某一個step引用。它通常對所有的steps都是可用的。一個例子:“終止工作流”,在任何一步,都有可能終止工作流。
需要注重的是:這兩種actions要具備唯一的ID,而不能和其他action的ID重復。
接下來主要講解關于function的四種情況:
osworkflow中的function就是可以在變遷之前或者后進行執行的內容。
1、 基于java的functions
從classloader中加載java 類,通過jndi找會java類,遠程ejbs,本地ejb。
這一類型的function必須實現接口:com.opensymphony.workflow.FunctionProvider,在這個接口中有一個方法execute。這個方法(execute)需要三個參數
可以自己去查api即可找到這三個參數,兩個map一個propertyset
基于java的functions
新聞熱點
疑難解答