版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、工作流調(diào)度算法作者:qwerty |源自:原創(chuàng)|發(fā)表日期:2007-4-14 |閱讀次數(shù):242 |【保存文章至硬盤】【打印文章】主要比較:OBE,Shark,OSWorkflow,jBpm。分析一下他們的調(diào)度算法,就 基本上可以知道其能力有多強(qiáng)。OBE的引擎調(diào)度機(jī)制說到開源引擎,首先就要說一下OBE,這是最早一款支持XPDL的開源工作流 引擎??上в捎跊]有良好的持續(xù)維護(hù),到如今,雖然Adrian依然還在對其進(jìn)行 一些補(bǔ)充和修改,但已經(jīng)掩飾不出其“落寞”的容顏了( HYPERLINK /james999/category/57982.aspx)%e3%80%82 /james999/categ
2、ory/57982.aspx)。OBE的引擎運轉(zhuǎn)調(diào)度算法是很簡單的,其所有的調(diào)度規(guī)則都是依據(jù)于 WorkflowRunner類的run方法。采用遍歷循環(huán)的方式,這個遍歷機(jī)制就是:/* 摘自 WorkflowRunner 類的 run 方法 */while (!_activityStack.isEmpty() /_activityStack中暫存著需要被激活的活動實例ActivityContext ap = (ActivityContext)_activityStack.pop();_ctx.setActivityContext(ap.activity, ap.instance);/雖然叫exe
3、cute,但是其實際上是一個激活活動實例的行為executeActivityInstance(ap.activity, ap.instance);/*在初始化任何一個活動實例后,將這個活動實例放A_activityStack這個堆棧 中。然后調(diào)用WorkflowRunner的run方法。在這個方法中,遍歷_activityStack 堆棧中的活動實例,進(jìn)行運行。*/ 但是什么情況下會激活WorkflowRunner的run呢? StartProcess, startActivity,completeActivity,executeTransition 這些情況下,都會造成 run 的 運行。O
4、BE的調(diào)度算法是很簡單,但是執(zhí)行這個調(diào)度過程,是比較繞的。想弄 清楚到底如何運行的,大家有必要去仔細(xì)閱讀閱讀WorkflowRunner類。從 StartProcess 方法開始,跟蹤起 startActivity,completeActivity, executeTransition這幾個方法之間的調(diào)用關(guān)系。這樣的引擎調(diào)度機(jī)制是比較單 一的。將一些控制判斷交給了外圍的過程。引擎本身并沒有多少實際的調(diào)度,只 是一個執(zhí)行體:獲取需要執(zhí)行(激活)的活動實例,然后執(zhí)行(激活)。工作流引擎核心調(diào)度算法與PetriNet by胡長城(銀狐999)補(bǔ)充一下,OBE有 個非常值得參考和吸收的地方,就是其Li
5、stener的應(yīng)用。雖然Listener對引擎 來說只是一個外設(shè),但是卻為其跟蹤整個引擎得調(diào)度留下了很多可擴(kuò)展接口。當(dāng) 然OBE內(nèi)核主要是兩個類:WorkflowRunner(負(fù)責(zé)引擎調(diào)度)和EngineContext (運行環(huán)境)Shark的引擎調(diào)度機(jī)制和OBE同樣支持XPDL的模型描繪語言的還有一個引擎Shark,Shark是目 前體系結(jié)構(gòu)最為龐大和完善的開源工作流引擎。不光提供了對分布式的支持(基 于Corba),而且提供了多線程的事務(wù)安全控制。Shark的內(nèi)部調(diào)度機(jī)制也比較簡單,與OBE類似。Shark的整個調(diào)度方法也基 本上是基于WfProcessImpl內(nèi)的run方法,也采用的是遍
6、歷循環(huán)的方式。只是 OBE是遍歷待激活的活動實例,而Shark是遍歷已經(jīng)完成的活動實例,然后往 下推進(jìn)。一一估計Shark是故意為了避免。與OBE類似,所以選擇了這么一 種算法。因為你會發(fā)現(xiàn),他們的執(zhí)行推進(jìn)機(jī)制是較為相像的。Shark遍歷循環(huán)的機(jī)制是: /* 摘自 WfProcessImpl 類的 run 方法 */protected void run (SharkTransaction t, WfActivitylnternal lastFinishedActivity)如說是啟動流程,啟動流程實例的時候,不指定lastFinishedActivityif (lastFinishedActi
7、vity=null) Set starts=getProcessDefinition(t).getStartingActivities();for (Iterator it=starts.iterator(); it.hasNext();) startActivity(t,asDefId,actDef,null);開始遍歷已經(jīng)結(jié)束的活動實例while (lastFinishedActivities.size()0) if(!state.equals(SharkConstants.STATE_OPEN_NOT_RUNNING_SUSPENDED) 執(zhí)行當(dāng)前活動實例后續(xù)的行為queueNext(t
8、, (WfActivityInternal)lastFinishedActivities.get(0);lastFinishedActivities.remove(0); else return;/*任何一個活動點完成之后(不論是Complete還是Terminate),會將自身放 入lastFinishedActivities列表中,然后調(diào)用run方法,促發(fā)對這個列表的循環(huán) 遍歷。*/有興趣對這方面研究的,可以看看WfProcessImpl內(nèi)的start、run、 activity_complete、activity_terminate 這幾個方法。工作流引擎核心調(diào)度算法與PetriNet
9、by胡長城(銀狐999)從調(diào)度機(jī)制上說,shark和obe基本雷同。甚至可以看到,其兩個運行類都基 本上有些類似:shark 是 WfProcessImpl 類,obe 是 WorkflowRunner 類。 兩個類都是即包含了調(diào)度的前推因素(比如起動流程實例、活動實例結(jié)束等方 法),也包含了調(diào)度的規(guī)則運算(run方法)。唯一不同的就是,shark是對已 經(jīng)完成的活動實例進(jìn)行遍歷,然后前推;而OBE則是對需要激活的活動實例進(jìn) 行遍歷,進(jìn)行前推點評:OBE和Shark的run調(diào)度方法,是比較常用的調(diào)度機(jī)制。首先效率上比較還 是可以,其實比較直觀,也容易理解。而且連個引擎的執(zhí)行機(jī)制有一定的雷同,
10、這可能是由于兩者都采用XPDL的緣故。但是,受他們調(diào)度機(jī)制的影響。OBE和Shark是很難支持復(fù)雜的運轉(zhuǎn)模型,比 如“搶占模式(Workflow Pattern中叫延遲選擇)”。OSWorkflow的引擎執(zhí)行機(jī)制OSWorkflow與其說是一個工作流引擎,不如說是一個“可嵌入式狀態(tài)機(jī)”。其 機(jī)制并不類似于我們通常所說的“流程”。其是以“動作(Action)”作為驅(qū)動 的。所以O(shè)SWorkflow用在如“bug跟蹤”等處理流程中,是非常適合的。從狹義上說,OSWorkflow是不存在什么調(diào)度機(jī)制的。如果硬要說的話,那么就 可以從AbstractWorkflow這個類的兩個方法來看:doActio
11、n和 transitionWorkflow。 OSWorkflow應(yīng)該說是一個執(zhí)行機(jī)制:執(zhí)行某一個Action,并將狀態(tài)從A轉(zhuǎn)變?yōu)锽。這個狀態(tài)的轉(zhuǎn)變,可能是從一個step的某一 個status變?yōu)榱硪?status;也可能是從一個step的某一個status變?yōu)榱硪?個 step 的某一個 status。(注:對osworkflow 來說,step+status 表現(xiàn)為一 個state)。在這種狀態(tài)變遷過程中,會執(zhí)行一系列的Function。當(dāng)然,OSWorkflow 有很大的靈活性取決于其Function機(jī)制。這種Function機(jī)制,有興趣的可以 參考參考。最近很多人詢問我,是否可以將OS
12、Workflow用于他們的辦公自動化系統(tǒng)中。其 實這方面OSWorkflow處理起來并不是很適合,通常一個OA的審批流程是很難 用OSWorkflow做的完美的。JBpm的引擎執(zhí)行機(jī)制如果大家對UML的Activity Diagram很熟悉的話,理解jBpm就易如反掌了。 在jBpm中也應(yīng)用了 Token。但是這個Token和PetriNet的概念和語義是不同 的。jBpm的token是用于表示任務(wù)分配給某一個actor (執(zhí)行者,可以是人、 系統(tǒng)等等)的依據(jù),也就是說,只有某一個actor拿到token,才有可能去執(zhí)行 任務(wù)。 當(dāng)然,由于jBpm這一塊的算法,也局限了 jBpm的復(fù)雜邏輯處理
13、。從狹義上說,jBpm這個也不能算是什么調(diào)度機(jī)制,也只能說是執(zhí)行機(jī)制。只是 這個執(zhí)行工作流引擎核心調(diào)度算法與PetriNet by胡長城(銀狐999)機(jī)制要比OSWorkflow復(fù)雜很多。OSWorkflow的推進(jìn)執(zhí)行機(jī)制是Action的執(zhí)行,而 jBpm的推進(jìn)機(jī)制則是Token的轉(zhuǎn)移在往下閱讀閱讀的時候,大家有必要把jBpm的一些基本元素和理念搞懂??梢?參考: HYPERLINK /james999/category/57982.aspx /james999/category/57982.aspx首先需要說明的是,jBpm在將任務(wù)分配給某一個Actor (也就是jBpm所描述 得執(zhí)行者)的
14、時候,也會將一個Token對象分配給這個Actor。不論這個Actor 是執(zhí)行接受任務(wù)”還是提交任務(wù)”,其首選都必須獲取一個ExecutionService對 象(當(dāng)然,每一個Actor在獲取其所需要執(zhí)行的任務(wù)的時候,也就是獲取一個 token對象標(biāo)識,那么這個時候,token的作用又似乎類似于我們通常所理解 的 WorkItem 意圖)。/* jBpm如何開發(fā)調(diào)用*/ExecutionService executionService =JbpmServiceFactory.getInstance().openExecutionService(actorId);InvocationLog in
15、vocationLog = null;/如果是啟動流程實例invocationLog =executionService.startProcessInstance( definitionId,variables,transitionName ) ;如果是結(jié)束任務(wù)State(State是jBpm的任務(wù)點,不要理解成了狀態(tài))invocationLog =executionService.endOfState( tokenId,variables,transitionName );當(dāng)然,看到這兒,大家一定很關(guān)心,這個Token到底是如何產(chǎn)生的? jBpm 引擎會在 start of Process
16、Instance 的時候,產(chǎn)生一個 root-tokeno 并把 這個root token放入ExecutionContext中,而這個token對象會在流程實例運 行過程中,跟隨著轉(zhuǎn)移,從而來表示任務(wù)的轉(zhuǎn)移。先來看看流程實例在ExecutionService中是如何啟動的:/* 摘自 ExecutionServiceImpl 類的 startProcessInstance 方法 */直接構(gòu)造流程實例對象,/并且在構(gòu)造過程中,產(chǎn)生一個屬于這個流程實例的Token對象ProcessInstanceImpl processInstance = new ProcessInstanceImpl( de
17、finition );TokenImpl rootToken = (TokenImpl) processInstance.getRoot();/創(chuàng)建執(zhí)行環(huán)境對象ExecutionContextImpl executionContext =new ExecutionContextImpl( actorId, this, rootToken );獲取后續(xù)Transition,然后將當(dāng)前執(zhí)行環(huán)境賦予此轉(zhuǎn)移TransitionImpl transition =(StateImpl)definition.getStartState().getLeavingTransition( transitionNa
18、me );transition.acceptToken( executionContext );/*工作流引擎核心調(diào)度算法與PetriNet by胡長城(銀狐999)又是 ExecutionContext,這一塊很多引擎都維護(hù)了一套執(zhí)行環(huán)境對象,比如OBE中的 EngineContext*/讓我們再來看看,如果一個State被結(jié)束了,那么在ExecutionService中是如何驅(qū)動的:/* 摘自 ExecutionServicelmpl 類的 endOfState 方法 */首先需要構(gòu)造一個執(zhí)行環(huán)境對象ExecutionContextImpl executionContext =new ExecutionContextImpl( actorId, this, token );獲取Token所在的StateStateImpl state = (StateImpl) token.getState();/轉(zhuǎn)移 TokenTransitionImpl transition = state.getLeavingTransition( transitionName );transition.acceptToken( executionContext );接下來讓我們跟蹤一下Transition到底十了些什么:/* 摘自 TransitionImpl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版美團(tuán)外賣商家綠色包裝與環(huán)保承諾合同4篇
- 二零二五版貓咪寵物行業(yè)投資與融資協(xié)議4篇
- 2024資格考試綜合服務(wù)項目協(xié)議版B版
- 二零二四年度住宅小區(qū)地下車庫租賃協(xié)議3篇
- 二零二五年度住宅小區(qū)車位租賃及增值服務(wù)合同11篇
- 二零二五版體育設(shè)施建設(shè)項目貸款合同樣本2篇
- 二零二五年度房地產(chǎn)開發(fā)項目合作投資協(xié)議書4篇
- 二零二五版跨境電商搬運物流合同2篇
- 二零二五年度文化演藝中心工程承包協(xié)議4篇
- 二零二五版高端茶樹品種購銷合同典范3篇
- 保險反洗錢培訓(xùn)
- 普通高中生物新課程標(biāo)準(zhǔn)
- 茉莉花-附指法鋼琴譜五線譜
- 結(jié)婚函調(diào)報告表
- SYT 6968-2021 油氣輸送管道工程水平定向鉆穿越設(shè)計規(guī)范-PDF解密
- 冷庫制冷負(fù)荷計算表
- 肩袖損傷護(hù)理查房
- 設(shè)備運維管理安全規(guī)范標(biāo)準(zhǔn)
- 辦文辦會辦事實務(wù)課件
- 大學(xué)宿舍人際關(guān)系
- 2023光明小升初(語文)試卷
評論
0/150
提交評論