OSWorkFlow分析.doc_第1頁
OSWorkFlow分析.doc_第2頁
OSWorkFlow分析.doc_第3頁
OSWorkFlow分析.doc_第4頁
OSWorkFlow分析.doc_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

OSWorkFlow分析1.OSWorkFlow基本概念 在商用和開源世界里,OSWorkflow都不同于這些已有的工作流系統(tǒng)。最大不同在于OSWorkflow有著非常優(yōu)秀的靈活性。在開始接觸 OSWorkflow時可能較難掌握(有人說不適合工作流新手入門),比如,OSWorkflow不要求圖形化工具來開發(fā)工作流,而推薦手工編寫 xml格式的工作流程描述符。它能為應用程序開發(fā)者提供集成,也能與現(xiàn)有的代碼和數(shù)據(jù)庫進行集成。這一切似乎給正在尋找快速“即插即用”工作流解決方 案的人制造了麻煩,但研究發(fā)現(xiàn),那些“即插即用”方案也不能在一個成熟的應用程序中提供足夠的靈活性來實現(xiàn)所有需求。2.OSWorkFlow主要優(yōu)勢OSWorkflow 給你絕對的靈活性。OSWorkflow被認為是一種“低級別”工作流實現(xiàn)。與其他工作流系統(tǒng)能用圖標表現(xiàn)“Loops(回路)”和 “Conditions(條件)”相比,OSWorkflow只是手工“編碼(Coded)”來實現(xiàn)的。但這并不能說實際的代碼是需要完全手工編碼的, 腳本語言能勝任這種情形。OSWorkflow不希望一個非技術(shù)用戶修改工作流程,雖然一些其他工作流系統(tǒng)提供了簡單的GUI用于工作流編輯,但像 這樣改變工作流,通常會破壞這些應用。所以,進行工作流調(diào)整的最佳人選是開發(fā)人員,他們知道該怎么改變。不過,在最新的版本中,OSWorkflow也 提供了GUI設計器來協(xié)助工作流的編輯。OSWorkflow基于有限狀態(tài)機概念。每個state由stepID和 status聯(lián)合表現(xiàn)(可簡單理解為step及其status表示有限狀態(tài)機的state)。一個state到另一state的 transition依賴于action的發(fā)生,在工作流生命期內(nèi)有至少一個或多個活動的state。這些簡單概念展現(xiàn)了 OSWorkflow引擎的核心思想,并允許一個簡單XML文件解釋工作流業(yè)務流程。3.OSWorkFlow核心概念3.1.概念定義步驟(Step)一個Step描述的是工作流所處的位置??赡軓囊粋€StepTranstion(流轉(zhuǎn))到另外一個Step,或者也可以在同一個Step內(nèi)流轉(zhuǎn)(因為Step可以通Status來細分,形成多個State)。一個流程里面可以多個Step。狀態(tài)(Status) 工作流Status是用來描述工作流程中具體Step(步驟)狀態(tài)的字符串。OSWorkflow的有Underway(進行中)、Queued (等候處理中)、Finished(完成)三種Status。一個實際State(狀態(tài))真正是由兩部分組成:State=(Step+ Status)。流轉(zhuǎn)(Transtion)一個State到另一個State的轉(zhuǎn)移。動作(Action)Action 觸發(fā)了發(fā)生在Step內(nèi)或Step間的流轉(zhuǎn),或者說是基于State的流轉(zhuǎn)。一個step里面可以有多個Action。Action和 Step之間的關(guān)系是,Step說明“在哪里”,Action說明“去哪里”。一個Action典型地由兩部分組成:可以執(zhí)行此Action (動作)的Condition(條件),以及執(zhí)行此動作后的Result(結(jié)果)。條件(Condition)類似于邏輯判斷,可包含“AND”和“OR”邏輯。比如一個請假流程中的“本部門審批階段”,該階段利用“AND”邏輯,判斷流程狀態(tài)是否為等候處理中,以及審批者是否為本部門主管。結(jié)果(Result)Result 代表執(zhí)行Action(動作)后的結(jié)果,指向新的Step及其StepStatus,也可能進入Split或者Join。Result分 為兩種,Contidional-Result(有條件結(jié)果),只有條件為真時才使用該結(jié)果,和Unconditional-Result(無條件 結(jié)果),當條件不滿足或沒有條件時使用該結(jié)果。分離/連接(Split/Join)流程的切分和融合。很簡單的概念,Split可以提供多個Result(結(jié)果);Join則判斷多個CurrentStep的態(tài)提供一個Result(結(jié)果)。3.2.步驟、狀態(tài)和動作(Step,Status,andAction)工作流要描述步驟(Step)、步驟的狀態(tài)(Status)、各個步驟之間的關(guān)系以及執(zhí)行各個步驟的條件和權(quán)限,每個步驟中可以含有一個或多個動作(Action),動作將會使一個步驟的狀態(tài)發(fā)生改變。對 于一個執(zhí)行的工作流來講,步驟的切換是不可避免的。一個工作流在某一時刻會有一個或多個當前步驟,每個當前步驟都有一個狀態(tài)值,當前步驟的狀態(tài)值組成了工 作流實例的狀態(tài)值。一旦完成了一個步驟,那么這個步驟將不再是當前步驟(而是切換到一個新的步驟),通常一個新的當前步驟將隨之建立起來,以保證工作流繼 續(xù)執(zhí)行。完成了的步驟的最終狀態(tài)值是用Old-Status屬性指定的,這個狀態(tài)值的設定將發(fā)生在切換到其他步驟之前。Old-Status的值可以是任 意的,但在一般情況下,我們設置為Finished。切換本身是一個動作(Action)的執(zhí)行結(jié)果。每個步驟可以含有多個動作,究竟要 載入哪個動作是由最終用戶、外部事件或者Tiggerd的自動調(diào)用決定的。隨著動作的完成,一個特定的步驟切換也將發(fā)生。動作可以被限制在用戶、用戶組或 當前狀態(tài)。每一個動作都必須包含一個UnconditionalResult和0個或多個ConditionalResults。所 以,總體來說,一個工作流由多個步驟組成。每個步驟有一個當前狀態(tài)(例如:Queued,UnderwayorFinished),一個步驟包含多 個動作。每個步驟含有多個可以執(zhí)行的動作。每個動作都有執(zhí)行的條件,也有要執(zhí)行的函數(shù)。動作包含有可以改變狀態(tài)和當前工作流步驟的results。3.3.結(jié)果、分支和連接(Results,Joins,andSplits)3.3.1.無條件結(jié)果(UnconditionalResult)對于每一個動作來講,必須存在一個UnconditionalResult。一個result是一系列指令,這些指令將告訴OSWorkFlow下一個任務要做什么。這包括使工作流從一個狀態(tài)切換到另一個狀態(tài)。3.3.2.有條件結(jié)果(ConditionalResult)ConditionalResult 是UnconditionalResult的一個擴展。它需要一個或多個Condition子標簽。第一個為true的Conditional(使用 AND或OR類型),會指明發(fā)生切換的步驟,這個切換步驟的發(fā)生是由于某個用戶執(zhí)行了某個動作的結(jié)果導致的。3.3.3.三種不同的Results(conditionalorunconditional)一個新的、單一的步驟和狀態(tài)的組合。一個分裂成兩個或多個步驟和狀態(tài)的組合。將這個和其他的切換組合成一個新的單一的步驟和狀態(tài)的組合。每種不同的result對應了不同的xml描述,你可以閱讀/osworkflow/workflow_2_7.dtd,獲取更多的信息。注意:通常,一個split或一個join不會再導致一個split或join的發(fā)生。3.4.自動步驟(Autoactions)有 的時候,我們需要一些動作可以基于一些條件自動地執(zhí)行。為了達到這個目的,你可以在action中加入auto=true屬性。流程將考察這個動作的 條件和限制,如果條件符合,那么將執(zhí)行這個動作。Autoaction是由當前的調(diào)用者執(zhí)行的,所以將對該動作的調(diào)用者執(zhí)行權(quán)限檢查。3.5.整合抽象實例(IntegratingwithAbstractEntities)建 議在你的核心實體中,例如Document或Order,在內(nèi)部創(chuàng)建一個新的屬性:workflowId。這樣,當新的 Document或Order被創(chuàng)建的時候,它能夠和一個workflow實例關(guān)聯(lián)起來。那么,你的代碼可以通過 OSWorkflowAPI查找到這個workflow實例并且得到這個workflow的信息和動作。3.6.工作流實例狀態(tài)(WorkflowInstanceState)有 的時候,為整個workflow實例指定一個狀態(tài)是很有幫助的,它獨立于流程的執(zhí)行步驟。OSWorkflow提供一些workflow實例中可以包含的 meta-states。這些meta-states可以是CREATED,ACTIVATED,SUSPENDED,KILLED和 COMPLETED。當一個工作流實例被創(chuàng)建的時候,它將處于CREATED狀態(tài)。然后,只要一個動作被執(zhí)行,它就會自動的變成ACTIVATED狀 態(tài)。如果調(diào)用者沒有明確地改變實例的狀態(tài),工作流將一直保持這個狀態(tài)直到工作流結(jié)束。當工作流不可能再執(zhí)行任何其他的動作的時候,工作流將自動的變成 COMPLETED狀態(tài)。然而,當工作流處于ACTIVATED狀態(tài)的時候,調(diào)用者可以終止或掛起這個工作流(設置工作流的狀態(tài)為 KILLED或SUSPENDED)。一個終止了的工作流將不能再執(zhí)行任何動作,而且將永遠保持著終止狀態(tài)。一個被掛起了的工作流會被凍結(jié),他也不能 執(zhí)行任何的動作,除非它的狀態(tài)再變成ACTIVATED。4.OSWorkFlow包用途分析及代碼片斷4.1.com.opensymphony.workflow該 包為整個OSWorkflow引擎提供核心接口。例如com.opensymphony.workflow.Workflow接口,可以說,實際開 發(fā)中的大部分工作都是圍繞該接口展開的,該接口有BasicWorkflow、EJBWorkflow、OfbizWorkflow三個實現(xiàn)類。4.2.com.opensymphony.workflow.basic該包有兩個類,BasicWorkflow與BasicWorkflowContext。BasicWorkflow不支持事務,盡管依賴持久實現(xiàn),事務也不能包裹它。BasicWorkflowContext在實際開發(fā)中很少使用。publicvoidsetWorkflow(intuserId)Workflowworkflow=newBasicWorkflow(Integer.toString(userId);4.3.com.opensymphony.workflow.config該 包有一個接口和兩個該接口的實現(xiàn)類。在OSWorkflow2.7以前,狀態(tài)由多個地方的靜態(tài)字段維護,這種方式很方便,但是有很多缺陷和約束。最 主要的缺點是無法通過不同配置運行多個OSWorkflow實例。實現(xiàn)類DefaultConfiguration用于一般的配置文件載入。而 SpringConfiguration則是讓Spring容器管理配置信息。publicvoidsetWorkflow(intuserId)Workflowworkflow=newBasicWorkflow(Integer.toString(userId);4.4.com.opensymphony.workflow.ejb 該包有兩個接口WorkflowHome和WorkflowRemote。該包的若干類中,最重要的是EJBWorkflow,該類和 BasicWorkflow的作用一樣,是OSWorkflow的核心,并利用EJB容器管理事務,也作為工作流 sessionbean的包裝器。4.5.com.opensymphony.workflow.loader該包有若干類,用得最多的是XxxxDescriptor,如果在工作流引擎運行時需要了解指定的動作、步驟的狀態(tài)、名字,等信息時,這些描述符會起到很大作用。publicStringfindNameByStepId(intstepId,StringwfName)WorkflowDescriptorwd=workflow.getWorkflowDescriptor(wfName);StepDescriptorstepDes=wd.getStep(stepId);returnstepDes.getName();4.6.com.opensymphony.workflow.ofbizOfbizWorkflow和BasicWorkflow在很多方面非常相似,除了需要調(diào)用ofbiz的TransactionUtil來包裝事務。4.7.com.opensymphony.workflow.query該 包主要為查詢而設計,但不是所有的工作流存儲都支持查詢。通常,Hibernate和JDBC都支持,而內(nèi)存工作流存儲不支持。值得注意的是 Hibernate存儲不支持混合型查詢(例如,一個查詢同時包含了historystep上下文和currentstep上下文)。執(zhí) 行一個查詢,需要創(chuàng)建WorkflowExpressionQuery實例,接著調(diào)用Workflow對象的query方法來得到最終查詢結(jié) 果。publicListqueryDepAdmin(intuserId,inttype)intarr=getSubPerson(userId,type);/構(gòu)造表達式Expressionexpressions=newExpression1+arr.length;ExpressionexpStatus=newFieldExpression(FieldExpression.STATUS,FieldExpression.CURRENT_STEPS,FieldExpression.EQUALS,Queued);expressions0=expStatus;for(inti=0;iarr.length;i+)ExpressionexpOwner=newFieldExpression(FieldExpression.OWNER,FieldExpression.CURRENT_STEPS,FieldExpression.EQUALS,Integer.toString(arri);expressionsi+1=expOwner;/查詢未完成流編號ListwfIdList=null;tryWorkflowExpressionQueryquery=newWorkflowExpressionQuery(newNestedExpression(expressions,NestedExpression.AND);wfIdList=workflow.query(query);catch(Exceptione)e.printStackTrace();4.8.com.opensymphony.workflow.soapOSWorkflow通過SOAP來支持遠端調(diào)用。這種調(diào)用借助WebMethods實現(xiàn)。4.9.com.opensymphony.workflow.spi該包可以說是OSWorkflow與持久層打交道的途徑,如當前工作流的實體,其中包括:EJB、Hibernate、JDBC、Memory、Ofbiz、OJB、Prevayler。HibernateWorkflowEntryhwfe=(HibernateWorkflowEntry)getHibernateTemplate().find(fromHibernateWorkflowEntrywhereId=+wfIdList.get(i).get(0);4.10.com.opensymphony.workflow.util該包是OSWorkflow的工具包,包括了對BeanShell、BSF、EJBLocal、EJBRemote、JNDI的支持。5.OSWorkFlow表結(jié)構(gòu)分析5.1.OS_WFENTRY工作流主表,存放工作流名稱和狀態(tài)字段名數(shù)據(jù)類型說明IDNUMBER自動編號NAMEVARCHAR2(20)工作流名稱STATENUMBER工作流狀態(tài)5.2.OS_CURRENTSTEP當前步驟表,存放當前正在進行步驟的數(shù)據(jù)字段名數(shù)據(jù)類型說明IDNUMBER自動編號ENTRY_IDNUMBER工作流編號STEP_IDNUMBER步驟編號ACTION_IDNUMBER動作編號OWNERVARCHAR2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論