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

下載本文檔

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

文檔簡(jiǎn)介

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論