版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
本科畢業(yè)設(shè)計(論文)闡明書基于C++BPEL流程引擎原型設(shè)計與實現(xiàn)學(xué)院軟件學(xué)院專業(yè)軟件工程學(xué)生姓名指引教師提交日期年6月3日華南理工大學(xué)畢業(yè)設(shè)計(論文)任務(wù)書茲發(fā)給班學(xué)生畢業(yè)設(shè)計(論文)任務(wù)書,內(nèi)容如下:1.畢業(yè)設(shè)計(論文)題目:基于C++BPEL流程引擎原型設(shè)計與實現(xiàn)2.應(yīng)完畢項目:(1)4月10日前擬定提綱并提交開題報告(2)5月25日前完畢論文草稿(3)進行基于C++BPEL引擎原型設(shè)計與開發(fā)(4)參照外文文獻資料并提交外文翻譯譯文3.參照資料以及闡明:(1)楊開誠.數(shù)據(jù)構(gòu)造[M].電子工業(yè)出版社.(9).(2)JamesGosling,BillJoy,GuySteeleandGiladBracha,TheJavalanguagespecificationthirdedition[M].Addison-Wesley,.(3)StanleyB.Lippman,JoséeLajoie,C++Primer,清華大學(xué)出版社.(4)楊洪波.BPEL4People思想解讀[J].軟件世界.(11).(5)萬露.基于SOA和BPEL業(yè)務(wù)流程管理研究與應(yīng)用[J].計算機與當代化.(8).(6)APACHEODE.(7)Jacob.(8)BoostSerialize.4.本畢業(yè)設(shè)計(論文)任務(wù)書于年月日發(fā)出,應(yīng)于年月日前完畢,然后提交畢業(yè)考試委員會進行答辯。專業(yè)教研組(系)、研究所負責人審核年月日指引教師簽發(fā)年月日
畢業(yè)設(shè)計(論文)評語:畢業(yè)設(shè)計(論文)總評成績:畢業(yè)設(shè)計(論文)答辯負責人簽字:年月日摘要本文詳細簡介了BPEL流程引擎以及流程管理系統(tǒng)理論知識與應(yīng)用。由于當前幾乎所有BPEL流程引擎核心都是基于JAVA語言編寫,與操作系統(tǒng)底層交互限度較低,運營效率相對地下,在大規(guī)模應(yīng)用上存在一定局限性。而C++語言重要特質(zhì)之一就是高效,與操作系統(tǒng)底層交互良好。針對C++語言各自特點,和當前計算機軟件界使用C++開發(fā)流程引擎空白,進一步提高流程引擎效率,本文提出了基于C++語言BPEL流程引擎原型設(shè)計方案,并對其進行了實現(xiàn)。流程引擎是運營通過編譯可執(zhí)行業(yè)務(wù)流程語言(普通是BPEL)定義文獻核心某些,其重要三大功能分別是解析業(yè)務(wù)流程語言定義活動并運營、支持構(gòu)造性活動、可以持久化地運營。而其中如何控制解決并發(fā)活動、如何持久化運營是流程引擎設(shè)計難點。只有解決了上述兩個問題,流程引擎才干真正意義上具備實用價值。本文先對APACHEODE流程引擎核心(即JACOB)作了進一步詳盡研究分析,對其解決并發(fā)活動所采用通信渠道機制和如何解決調(diào)度控制問題進行了詳細闡明;然后給出了JAVA語言與C++語言異同,在此基本上指出使用C++語言開發(fā)流程引擎時需要注意重點,并據(jù)此提出了基于C++使用調(diào)用堆棧和BOOST序列化庫來實現(xiàn)虛擬解決單元以及整個流程引擎設(shè)計方案和實現(xiàn)。成品測試表白,使用C++開發(fā)BPEL流程引擎是完全可行,整合了別的組件后可以實現(xiàn)完整流程管理系統(tǒng),其實際運營狀況令人滿意。C++在Web時代依然有著很強生命力,使用C++開發(fā)流程引擎應(yīng)當有遼闊發(fā)展前景。核心詞:業(yè)務(wù)流程執(zhí)行語言,業(yè)務(wù)流程引擎,虛擬解決單元
AbstractThispaperbrieflyintroducethetheoriesandapplicationsaboutBPELprocessengineandBusinessProcessManagementSystems.SincealmostallBPELengineisbasedonJAVAlanguage,whichdonothavegoodperformancewiththeunderlyingoperatingsystemandlowefficiency.Andtheymaycostacertainproblemwhilerunninglarge-scaleapplicationsasaresult.Aslongasweknow,C++isalanguagewiththemaincharacteristicsofhighefficiency,anditmakegoodinteractionwiththeunderlyingoperatingsystem.TofurtherimprovetheefficiencyofprocessengineusingthecharacteristicsofC++language,weputforwardaprojectofBPELprocessengineusingC++language.ProcessengineisthecorecomponentthatcanexecutecompiledrunnableBPELfiles.ItsthreemainfunctionsareexecuteactivitiesdefinedbyBPEL,PersistenceofexecutionstateandConcurrency.Thereinto,howtoimplementtopersistenceofexecutionstateandhowtocontrolconcurrencyaretwobigproblemswhiledesigningprocessengine.Onlysolvethesetwoproblems,canourenginebeworthiness.ThisarticlefirstanalyzesAPACHEODEenginecore(thatis,JACOB)indetail,interpretthechannelcommunicationmechanismsofJACOBwhichisusingtosolveconcurrencyproblem.Andthen,showstheimportantpointsofdesigningC++processengineandoursolutionswhichusestackandBoostserializationtodesignVPU,bygivingthesimilaritiesanddifferencebetweenJAVAandC++language.FinaltestshowedthattheBPELprocessenginedevelopedbyC++isentirelyfeasibleandcaneasilycompletelyarchiveamanagementsystemafterintegratedtheremainingcomponents,whichissatisfied.Asfaraswecanconcern,C++stillhasastrongvitalityintheWebarea,andtheprocessenginebasisonitshouldhavebroadprospectsincommerce.Keyword:BPEL,Processengine,VPU目錄摘要 IAbstract II第一章 緒論 11.1研究背景和意義 11.2國內(nèi)外研究現(xiàn)狀 21.3應(yīng)解決重要問題及應(yīng)達到技術(shù)規(guī)定 31.4本文組織構(gòu)造 4第二章BPEL理論概述 52.1BPEL語言理論知識 52.1.1BPEL語言作用域 52.1.2BPEL活動原則屬性和成員 52.1.3BPEL基本活動 62.1.4BPEL構(gòu)造化活動 72.1.5其她構(gòu)造化活動 72.2本章小結(jié) 8第三章關(guān)于ApacheODE流程引擎研究 93.1ApacheODE構(gòu)造總覽 93.1.1為什么選取參照ApacheODE流程引擎 103.1.2ODEBPEL編譯器 103.1.3ODEBPEL引擎運營時 103.1.4ODE數(shù)據(jù)訪問對象(DAOs) 103.1.5ODE集成層 113.2APACHEODE流程引擎JACOB框架 113.2.1什么是JACOB 113.2.2通道Channels 123.2.3Jacob對象(JacobObject)與Jacob可運營線程狀態(tài)(JacobRunnable) 123.2.4辦法集MethodLists(MLs) 133.2.5虛擬解決單元(VirtualProcessUnit)和執(zhí)行隊列(ExecutionQueue) 133.3實例解析 143.3本章小結(jié) 20第四章提出基于C++特性BPEL引擎方案 214.1JAVA和C++異同 214.2基于C++BPEL流程引擎核心設(shè)計方案 224.2.1并發(fā)控制設(shè)計方案 224.2.2C++多態(tài)機制在BPEL引擎中應(yīng)用 234.2.3基本活動解決 244.2.4構(gòu)造性活動解決 254.3本章小結(jié) 25第五章掛起與再啟動 265.1為什么需要掛機與再啟動 265.2序列化 265.2.1BoostSerialization 265.2.2BoostSerialization特點 265.2.3BoostSerialization使用 275.3本章小結(jié) 28第六章基于C++BPEL引擎原型設(shè)計與實現(xiàn) 296.1基于C++BPEL引擎重要模塊設(shè)計與實現(xiàn) 296.1.1系統(tǒng)層次架構(gòu) 296.1.2引擎運營時VPU模塊實現(xiàn) 306.1.3引擎運營時執(zhí)行隊列模塊實現(xiàn) 306.1.4BPEL引擎動態(tài)行為描述 316.1.5序列化實現(xiàn) 316.2系統(tǒng)應(yīng)用實例 326.2.1Sequence實例 326.2.2Flow實例 366.3本章小結(jié) 39第七章結(jié)論 407.1結(jié)論 407.2存在局限性 40參照文獻 41道謝 42附錄 43緒論1.1研究背景和意義什么是業(yè)務(wù)流程?業(yè)務(wù)流程可以被定義為一種由各種不同功能活動相連一組有互有關(guān)系任務(wù),它們依照一定業(yè)務(wù)邏輯和順序依次執(zhí)行。業(yè)務(wù)流程有起點和終點,并且它們都是可重復(fù)。業(yè)務(wù)流程是公司實現(xiàn)商務(wù)目的辦法。對于公司而言,業(yè)務(wù)流程是公司重要知識資產(chǎn),是公司核心競爭力體現(xiàn),一種精心設(shè)計和執(zhí)行業(yè)務(wù)流程可覺得公司創(chuàng)造價值并節(jié)約成本。在知名作家佛里德曼對經(jīng)濟全球化有著精彩闡述,它描繪了一種由互聯(lián)網(wǎng)、通信基本設(shè)施和新型軟件搭建全球舞臺;在這個舞臺上,人們可以以各種方式分享知識、勞動、娛樂和發(fā)現(xiàn),并且創(chuàng)造新商業(yè)機會。“如今沃爾馬是美國最大公司,然而它什么也不生產(chǎn),只是建立了這個非凡供應(yīng)環(huán)節(jié),從世界各地進口非常便宜商品……并把世界各地產(chǎn)品送到消費者手里。它是一種全球組裝線。”——《世界是平:21世紀簡史》[1]。在經(jīng)濟全球化過程中,公司邊界變得模糊,公司會將任務(wù)分解為一系列子任務(wù),公司只關(guān)注于自己核心競爭力所在,并將其她工作分包給最適當人來完畢。公司需要通過業(yè)務(wù)流程將這些片斷有機地組織在一起。在這里咱們可以深刻地結(jié)識到業(yè)務(wù)流程對公司重要性[2]。信息化產(chǎn)業(yè)中由此誕生了業(yè)務(wù)流程管理系統(tǒng),其核心某些就是流程引擎。定義業(yè)務(wù)流程并對其做出文檔所耗費時間和努力是完全值得。在一種反映中華人民共和國老式醫(yī)學(xué)電視劇中,當配備藥劑時候,掌柜把自己反鎖在藥房里,只有她會依照“秘方”將不同藥材調(diào)配成救死扶傷靈藥。然而只有她一人掌握這個過程是非常危險。對于當代公司來說這更是不也許,咱們不也許只讓配件制造主任理解公司配件制造知識,然后讓她每晚獨自裝配所有零件。只要定義了配件制造業(yè)務(wù)流程,配件制造工人可以隨時來去,并且任何配件制造工人都可以隨時取代另一種人工作,這是由于工廠里所有配件制造工人都理解并遵循業(yè)務(wù)流程。咱們可以學(xué)習、變化、評估,然后再次變化配件制造業(yè)務(wù)流程,由于該流程對于每個人都是可見,而非局限于配件制造主任。當代業(yè)務(wù)流程管理系統(tǒng)歷史可以追溯到工作流系統(tǒng)[2]。業(yè)務(wù)流程管理系統(tǒng)是自本世紀初以來公司信息技術(shù)應(yīng)用(信息化)背景上最重要和活躍概念之一。它有兩方面基本含義或理解背景。一方面是公司管理,一方面是公司應(yīng)用(軟件、系統(tǒng))。綜合而言,它是典型,在公司應(yīng)用強力推動下產(chǎn)生跨管理與信息技術(shù)領(lǐng)域流行概念之一。從管理角度,它可以看作是業(yè)務(wù)流程再造(BPR)所帶來以業(yè)務(wù)流程為中心管理思想延續(xù)與發(fā)展;從公司應(yīng)用角度,它是在工作流(Workflow)等技術(shù)基本上發(fā)展起來,基于業(yè)務(wù)流程建模,支持業(yè)務(wù)流程分析、建模、模仿、優(yōu)化、協(xié)同與監(jiān)控等功能新一代公司應(yīng)用系統(tǒng)核心。簡樸地來講,工作流定義了業(yè)務(wù)流程中參加者(Who)、所執(zhí)行工作(What)及何時執(zhí)行(When)。在公司IT環(huán)境中,工作流軟件普通與公司應(yīng)用集成(EnterpriseApplicationIntegration,EAI)系統(tǒng)結(jié)合在一起,成為公司應(yīng)用“黏合劑”,實現(xiàn)業(yè)務(wù)流程自動化和流水線化[2]。老式工作流系統(tǒng)最大缺陷就是:它們大多采用了專有技術(shù)。這使得業(yè)務(wù)流程與公司應(yīng)用結(jié)合變得非常復(fù)雜,普通需要很長時間進行布置和實行,而與公司外部系統(tǒng)進行集成則更加困難,無法適應(yīng)全球化浪潮和互聯(lián)網(wǎng)時代對公司靈活、無縫集成需求。人們開始考慮運用Web服務(wù)開放性和原則化,來解決業(yè)務(wù)流程與公司應(yīng)用之間互操作性問題。7月,IBM、微軟、BEA提交了BusinessProcessExecutionLanguageforWebServices(BPEL4WS)1.0規(guī)范。業(yè)務(wù)流程執(zhí)行語言基于XML和Web服務(wù)技術(shù),它融合了初期IBMWebServicesFlowLanguage(WSFL)及微軟XLANG規(guī)范諸多特點。隨后許多重要供貨商如SAP和Siebel(已被Oracle并購)等公司陸續(xù)加入規(guī)范制定,并催生了多項修改和改進,并于3月發(fā)布了1.1版。4月,BPEL被提交構(gòu)造化信息原則增進組織(OASIS)以實現(xiàn)原則化,并組建了Web服務(wù)業(yè)務(wù)流程執(zhí)行語言技術(shù)委員會(WSBPELTC),該努力使BPEL在業(yè)界獲得更為廣泛承認。當前該技術(shù)委員會正在致力于下一代規(guī)范制定工作,并將該規(guī)范重命名為WS-BPEL2.0。雖然除BPEL之外尚有某些業(yè)務(wù)流程規(guī)范,但是到當前為止,BPEL是最為成熟和被廣泛支持技術(shù)[6,13,14]?!叭f維網(wǎng)其共通之原則讓網(wǎng)絡(luò)應(yīng)用軟件溝通無礙[1]”隨著全球經(jīng)濟一體化,社會分工更加細致,業(yè)務(wù)流程管理系統(tǒng)應(yīng)用廣度與深度將越來越大。通過研究、摸索其核心某些,有助于提高筆者對新世紀計算機軟件技術(shù)發(fā)展和當代公司軟件結(jié)識。1.2國內(nèi)外研究現(xiàn)狀當前國外流行流程引擎重要有如下幾種[15]:OSWworkFlow:是完全用java語言編寫開放源代碼工作流引擎,具備明顯靈活性及完全面向有技術(shù)背景顧客特點。顧客可以依照自身需求運用這款開源軟件設(shè)計簡樸或是復(fù)雜工作流。JBPM:全稱是JavaBusinessProcessManagement(業(yè)務(wù)流程管理),它是覆蓋了業(yè)務(wù)流程管理、工作流、服務(wù)協(xié)作等領(lǐng)域一種開源、靈活、易擴展可執(zhí)行流程語言框架。JBPM是公開源代碼項目,它使用要遵循ApacheLicense,其最大特色就是它商務(wù)邏輯定義沒有采用當前某些規(guī)范,如WMC、XPDL、BPML、ebXML、BPEL4WS等,而是采用了它自己定義JBossjBPMProcessdefinitionlanguage(jPdl)。jPdl以為一種商務(wù)流程可以被看作是一種UML狀態(tài)圖。jPdl就是詳細定義了這個狀態(tài)圖每個某些,如起始、結(jié)束狀態(tài),狀態(tài)之間轉(zhuǎn)換,過圖型化流程定義,直觀地描述業(yè)務(wù)流程。APACHEODE(OrchestrationDirectorEngine):是基于Java開源WS-BPEL(簡稱BPEL)引擎,它于年7月18日從Apache孵化器中誕生成為一種頂級項目。它重要功能就是執(zhí)行使用BPEL描述業(yè)務(wù)流程,實現(xiàn)業(yè)務(wù)流程自動化,它支持長期運營和短期運營過程。WebSphereProcessServer基于WebSphereApplicationServer和WebSphereEnterpriseServiceBus,它為面向服務(wù)體系構(gòu)造(SOA)模塊化應(yīng)用程序提供了基本,并支持應(yīng)用業(yè)務(wù)規(guī)則,以驅(qū)動支持業(yè)務(wù)流程應(yīng)用程序。除此之外尚有BEAAquaLogic、OracleBPELProcessManager、IONAArtixOrchestration、ActiveBPEL、IntalioBPMS、MicrosoftBizTalkServer等等。在國內(nèi),重要是使用上述幾種引擎做擴展、應(yīng)用,研究流程引擎核心團隊、組織、個人非常少。同步,當前所有商業(yè)流程引擎或開源流程引擎均使用Java或C#實現(xiàn)。之因此沒有使用C++實現(xiàn)BPEL引擎,重要有三個因素:第一,普通電子商務(wù)應(yīng)用,重要是在較底層ESB上提高性能,而不是處在上層BPM;第二,各大廠商為了使她們生產(chǎn)產(chǎn)品系列配套,依照其原有產(chǎn)品基本來設(shè)計實現(xiàn)BPEL引擎;第三,開源項目事實上也是各大廠商主導(dǎo)推動,為其產(chǎn)品改進提供活躍技術(shù)支持,因而采用與其產(chǎn)品有關(guān)構(gòu)造。而C++語言相對其她語言具備性能上優(yōu)勢,因而本設(shè)計將采用C++語言來實現(xiàn)BPEL引擎,進一步提高BPEL引擎性能。1.3應(yīng)解決重要問題及應(yīng)達到技術(shù)規(guī)定BPEL引擎重要功能是執(zhí)行業(yè)務(wù)流程,是BPM架構(gòu)核心,其設(shè)計好壞、效率高低直接影響到整個BPM性能高低。[2,16]BPEL引擎重要功能是提供BPEL流程布置和運營環(huán)境。對于布置在BPEL引擎上業(yè)務(wù)流程,一方面解析流程文獻生成數(shù)據(jù)對象構(gòu)造,然后將數(shù)據(jù)對象構(gòu)造序列化并保存。執(zhí)行流程時候,將已保存數(shù)據(jù)對象構(gòu)造反序列化,并依照流程中構(gòu)造和活動執(zhí)行相應(yīng)操作,必要時將變量和流程執(zhí)行狀態(tài)持久化。執(zhí)行流程時,BPEL引擎在與服務(wù)交互過程中扮演了兩種角色:服務(wù)消費者和服務(wù)提供者,區(qū)別在于BPEL引擎是作為交互消息發(fā)起者或被發(fā)起者。交互消息類型有In-Only和In-Out兩種,區(qū)別在于與否需要返回成果。實現(xiàn)BPEL引擎時應(yīng)當注意這些區(qū)別。BPEL引擎核心——BPEL運營時,在執(zhí)行流程中需要解決兩個重要問題:第一,如何表達流程執(zhí)行狀態(tài),以便需要時候掛起當前狀態(tài),等待重新啟動。特別是對于需要長期運營流程,如果可以隨時將流程當前執(zhí)行狀態(tài)通過數(shù)據(jù)持久化機制掛起保存,則可以避免進入長等待時由于浮現(xiàn)系統(tǒng)故障而丟失流程執(zhí)行狀態(tài),無法恢復(fù)。第二,如何解決流程執(zhí)行并發(fā)性管理問題。普通來說,創(chuàng)立一種流程實例都應(yīng)當新建一種線程來執(zhí)行。流程自身也支持并發(fā)操作flow,常規(guī)做法是為流程內(nèi)并發(fā)操作新建線程執(zhí)行。由于流程內(nèi)并發(fā)操作數(shù)量不可知,有也許浮現(xiàn)線程泛濫甚至系統(tǒng)崩潰[12]。好做法應(yīng)當是將并發(fā)性管理建立在每個流程實例占用單個線程基本之上,避免創(chuàng)立過多線程而帶來線程調(diào)度對系統(tǒng)性能影響。1.4本文組織構(gòu)造本文第一章簡介了選題背景和意義。第二章將闡述與本課題有關(guān)計算機軟件知識,提出本課題需要解決核心問題。第三章與第四章將闡明設(shè)計原理并進行方案選取。其中第三章將詳細分析解說ApacheODE流程引擎核心某些,第四章將通過對JAVA語言和C++語言對比闡明設(shè)計原理并提出方案,闡明選取這個設(shè)計方案理由以及所采用方案特點。第五章與第六章將分點詳細闡述設(shè)計,并進行成果分析。其中第五章將致力于解決如何表達流程執(zhí)行狀態(tài)問題;第六章將結(jié)合第四章詳細闡述基于C++BPEL引擎設(shè)計與實現(xiàn),致力于解決如何流程執(zhí)行并發(fā)性管理問題。第七章將對整個研究工作進行歸納和綜合,闡述本課題研究中尚存在問題及進一步開展研究看法和建議。
第二章BPEL理論概述2.1BPEL語言理論知識BPEL全稱是業(yè)務(wù)流程可執(zhí)行語言,用于描述業(yè)務(wù)流程。流程由一系列活動構(gòu)成;通過作用域定義變量、合伙伙伴鏈接、有關(guān)集和事件響應(yīng)解決邏輯等;通過合伙伙伴鏈接定義與流程交互其她服務(wù);流程可以是有狀態(tài)長時間運營過程,并且一種流程可以同步存在各種實例,流程引擎通過有關(guān)集將一條消息關(guān)聯(lián)到特定流程實例。以上是BPEL描述業(yè)務(wù)流程基本狀況,下面詳細簡介OASIS制定WS-BPEL2.0原則中定義各個元素,以便加深人們對BPEL理解。[6,14]2.1.1BPEL語言作用域作用域Scope提供影響其內(nèi)部活動執(zhí)行成果上下文環(huán)境,涉及變量Variable,合伙伙伴鏈接PartnerLink,消息交互MessageExchange,有關(guān)集CorrelationSet,事件解決EventHandler,異常解決FaultHandler,補償解決CompensationHandler和終結(jié)解決TerminationHandler。作用域上下文環(huán)境可以多層次嵌套,父作用域中定義環(huán)境在子作用域中可見。每個流程根節(jié)點Process事實上就是一種頂層作用域。Process和Scope語法上是一致,但是她們有如下三點區(qū)別:Scope是一種活動而Process不是,活動原則屬性和成員在Process中不合用;Scope中包括補償解決和終結(jié)解決而Process中不容許包括;Scope中特有isolated隔離屬性在Process中不合用。盡管Process和Scope有所區(qū)別,但BPEL引擎中對她們解決基本上是一致,可以以為Process是一種特殊Scope。每個Scope都包括一種主活動,定義該作用域業(yè)務(wù)邏輯,這個活動可以是一種復(fù)雜擁有任意層次嵌套構(gòu)造化活動。其她上下文環(huán)境有關(guān)成員是可選。BPEL對Scope解決效率由主活動解決效率決定。2.1.2BPEL活動原則屬性和成員在BPEL原則定義各種元素中,BPEL活動用于表達流程業(yè)務(wù)邏輯,可分為基本活動和構(gòu)造化活動兩種類型?;净顒用枋隽鞒虡I(yè)務(wù)單個環(huán)節(jié)實現(xiàn),構(gòu)造化活動則編碼控制流邏輯,能遞歸包括其她基本活動或者構(gòu)造化活動。業(yè)務(wù)流程執(zhí)行事實上是BPEL活動執(zhí)行,其她元素只是提供輔助BPEL活動實際執(zhí)行過程中所需資源。依照BPEL原則提供各種基本活動和構(gòu)造化活動多層次嵌套,可以定義任意復(fù)雜業(yè)務(wù)邏輯,從而實現(xiàn)所需業(yè)務(wù)功能。BPEL引擎對活動解析和執(zhí)行效率決定了BPEL引擎效率。每個活動都包括兩個原則可選屬性,name和suppressJoinF屬性指定流程中各個活動機器可讀命名,用于區(qū)別不同活動。suppressJoinFailure是在并發(fā)解決Flow活動執(zhí)行中定義與否屏蔽接合活動異常,詳細詳見Flow活動。每個活動都包括兩個可選容器,sources和targets,分別存儲原則成員source和target。source和target用于通過Flow活動中Link元素擬定并發(fā)解決活動同步關(guān)系,每個Link相應(yīng)一種source活動和一種target活動,規(guī)定了在source活動執(zhí)行結(jié)束之后,才容許target活動開始執(zhí)行,保證了并發(fā)執(zhí)行活動中某些活動同步關(guān)系。詳細詳見Flow活動中Link元素。2.1.3BPEL基本活動(1)Invoke——調(diào)用Web服務(wù)操作Invoke活動用于調(diào)用服務(wù)提供者提供Web服務(wù),典型應(yīng)用是調(diào)用Web服務(wù)上一種操作。Invoke可以在其補償解決和異常解決中內(nèi)聯(lián)其她活動。依照WSDL文獻定義,操作可以是祈求響應(yīng)或者單向調(diào)用。BPEL原則對兩種方式調(diào)用使用相似語法,單向調(diào)用方式只需提供輸入變量或者輸入輸出變量都不提供,而祈求響應(yīng)方式需要同步提供輸入變量和輸出變量。(2)Receive和Reply——提供Web服務(wù)操作Receive和Reply活動用于業(yè)務(wù)流程為其合伙伙伴提供服務(wù)。Receive等待合伙伙伴發(fā)送祈求消息,并依照createInstance屬性決定與否創(chuàng)立流程實例。流程啟動活動涉及Receive和Pick兩種,流程必要以啟動活動開始,其她活動控制依賴于啟動活動,否則流程將無法執(zhí)行。Receive是一種阻塞活動,只有流程實例接受到一種匹配消息該活動才會結(jié)束。Reply用于發(fā)送響應(yīng)消息給之前通過Receive活動等接受祈求。這種響應(yīng)只對祈求響應(yīng)交互方式故意義。(3)Assign——更新變量和合伙伙伴鏈接Assign活動用于從一種變量到另一種變量復(fù)制數(shù)據(jù),或者使用表達式操作變量、屬性和常量來構(gòu)造和插入新數(shù)據(jù),或者在合伙伙伴鏈接之間復(fù)制端點引用。(4)Throw——拋出內(nèi)部異常Throw活動用于顯式拋出內(nèi)部異常。Throw必要提供異常名稱,可選提供更多異常有關(guān)信息,相應(yīng)異常解決可以運用這些信息解決異常,并發(fā)布異常消息到需要其她服務(wù)。(5)Wait——延遲執(zhí)行Wait活動用于指定一段特定期間延遲或者直到某個期限到來,當指定期間已過或者某個期限到來時,Wait活動立即結(jié)束。(6)Empty——什么事都不做Empty活動并不做任何事,但有些場合往往需要這樣一種活動,例如一種異常需要被捕獲或者禁止。Empty活動另一種用途是在并發(fā)Flow活動中提供一種同步點。(7)ExtensionActivity——增長活動類型ExtensionActivity活動用于引入BPEL原則未定義新活動。(8)Exit——及時終結(jié)流程執(zhí)行Exit活動用于及時終結(jié)業(yè)務(wù)流程實例。除了終結(jié)解決、異常解決和補償解決外,流程實例中所有當前正在運營活動都必要及時終結(jié)。(9)Rethrow——重新拋出已捕獲異常Rethrow活動用于異常解決中重新拋出已捕獲異常。Rethrow只能在異常解決Catch和CatchAll中使用。重新拋出異常包括信息是原始捕獲到異常信息,而不是通過異常解決修改過信息。2.1.4BPEL構(gòu)造化活動構(gòu)造化活動規(guī)定了一組活動集合執(zhí)行順序。構(gòu)造化活動以不同構(gòu)造組合基本活動,表達不同控制流模式、異常解決、外部事件以及業(yè)務(wù)合同中流程實例之間消息交互協(xié)調(diào)。構(gòu)造化活動可以以任意方式嵌套和組合。通過基本活動和構(gòu)造化活動多層次嵌套,可以創(chuàng)立出表達任意復(fù)雜業(yè)務(wù)邏輯流程[4]。BPEL原則定義各種構(gòu)造化活動,實現(xiàn)了不同控制流模式。BPEL原則定義構(gòu)造化活動集合并不是最小集,有些狀況下一種業(yè)務(wù)邏輯可以用不同活動來實現(xiàn)。例如一種順序業(yè)務(wù)邏輯可以使用Sequence活動實現(xiàn),也可以使用定義適當LinksFlow實現(xiàn)。而Sequence和Flow是BPEL構(gòu)造化活動中最重要兩個。(1)Sequence——順序執(zhí)行Sequence活動包括一種或各種按照浮現(xiàn)順序先后執(zhí)行子活動,當最后一種子活動執(zhí)行結(jié)束時Sequence活動結(jié)束。(2)Flow——并行和控制依賴解決Flow活動提供并發(fā)和同步機制。Flow子活動并發(fā)執(zhí)行,當所有子活動都結(jié)束時Flow才結(jié)束。子活動使能判斷為假而跳過執(zhí)行也以為該子活動結(jié)束。Flow同步啟動各個子活動執(zhí)行,其子活動各層次子活動之間也許存在同步依賴,因而Flow通過定義Link提供Flow內(nèi)部各層次子活動之間同步依賴。每個活動均有可選sources和targets容器,分別包括一組source和target元素,這些元素通過Link擬定活動之間同步關(guān)系。一種Link分別相應(yīng)一種source活動和target活動,規(guī)定在source活動執(zhí)行結(jié)束之前target活動不容許開始執(zhí)行。一種活動可以設(shè)立各種source,也可以設(shè)立各種target。targets容器中有個可選參數(shù)joinCondition定義各種target布爾組合方式,默認是或,即該活動相應(yīng)各種source活動只要有一種完畢即可開始執(zhí)行該活動。Link定義過程中不能形成控制環(huán),即一種source活動相應(yīng)target活動是其邏輯在前。2.1.5其她構(gòu)造化活動除了Sequence和Flow,構(gòu)造化活動尚有Pick(事件觸發(fā)選取解決)、ForEach(遍歷執(zhí)行)、While、RepeatUntil(循環(huán)執(zhí)行)、If、Elseif(選取執(zhí)行)等等。此類構(gòu)造化活動定義重要是為了能貼近人類語言,按照顧客指定表達式有選取地執(zhí)行活動。她們表達式解析和條件鑒定由該活動自身執(zhí)行辦法解決,然后按照顧客定義,以串行或者并行方式來調(diào)度她們。咱們可以以為,在流程引擎內(nèi)部,活動總是以串行或者并行方式進行調(diào)度和執(zhí)行,對其她活動類型并不關(guān)懷。Sequence和Flow構(gòu)造化活動是流程引擎重要工作模式和設(shè)計重點,實現(xiàn)了穩(wěn)定可靠串行與并行控制機制,就能在此基本上執(zhí)行其她構(gòu)造化活動。因而,咱們把Sequence和Flow活動作為核心點進行研究。2.2本章小結(jié) 本章重要簡介了BPEL語言基本理論,描述了BPEL基本活動與構(gòu)造化活動原則屬性和成員,并闡明了為什么SEQUENCE和FLOW是流程引擎解決核心活動類型。為下文鋪開APACHEODE流程引擎設(shè)計,提出基于C++BPEL流程引擎原型設(shè)計方案中如何解決解決并發(fā)控制某些作理論知識簡介。
第三章關(guān)于ApacheODE流程引擎研究ODE重要開發(fā)目的是開發(fā)可靠,構(gòu)造緊湊,可嵌入組件,可以管理使用BPEL流程描述語言長時間運營業(yè)務(wù)流程執(zhí)行。重點是開發(fā)具備最小依賴性小模塊,以便重新組裝成一種功能齊全業(yè)務(wù)流程管理系統(tǒng)。[4,16]3.1ApacheODE構(gòu)造總覽ODE架構(gòu)中核心構(gòu)成某些涉及BPEL編譯器、ODEBPEL引擎運營時,ODE數(shù)據(jù)訪問對象(DAOs),ODE集成層(ILs),和顧客工具[16]。編譯器把BPEL文獻轉(zhuǎn)換成運營時可執(zhí)行格式,運營時以一種可靠方式執(zhí)行她們,并通過DAO層把她們保存起來;運營時在集成層中運營,集成層將BPEL引擎連接到更為遼闊外部執(zhí)行環(huán)境。圖3.1APACHEODE流程引擎架構(gòu)圖3.1.1為什么選取參照ApacheODE流程引擎為了研究流程引擎內(nèi)部機制,必須研究學(xué)習其源代碼,由于咱們一方面考慮開源項目。而在諸多開源項目中,ApacheODE流程引擎是嚴格按照BPEL原則制定,有詳細規(guī)范文檔可參閱項目之一。其她流程引擎,如JBPM,擴展了BPEL,加入了其她繁雜功能,增長了分析難度。因而選取參照ApacheODE引擎能拋開別的干擾,在其嚴格原則下研究流程引擎內(nèi)部機制。3.1.2ODEBPEL編譯器BPEL編譯器負責把BPEL來源(即BPEL流程文獻,WSDLs和schemas)編譯成可執(zhí)行形式。編譯器輸出成果不是一種“好”編譯體現(xiàn)成果,也不是這些源文獻錯誤信息列表。編譯器生成成果是一種對象模型,類似于基本BPEL流程文獻構(gòu)造。但是,這種變異成果解決了BPEL中浮現(xiàn)各種名稱引用(如變量名),內(nèi)聯(lián)了所需WSDL和類型信息,并生成了各種構(gòu)造(如默認補償解決)。這些編譯成果(普通是一種擴展名為cbp文獻)是BPEL運營所需唯一對象。3.1.3ODEBPEL引擎運營時ODEBPEL引擎運營時在BPEL運營時模塊中建立,提供應(yīng)BPEL流程執(zhí)行。運營時提供了大量BPEL構(gòu)造實現(xiàn),以解決流程執(zhí)行中最復(fù)雜繁瑣工作。運營時同步也實現(xiàn)了何時應(yīng)當創(chuàng)立新實例,和把剛收到消息分發(fā)給哪個實例邏輯。最后,運營時實現(xiàn)了流程管理API以供顧客工具使用。為了在不可靠環(huán)境中實現(xiàn)可靠執(zhí)行過程,運營時依賴于數(shù)據(jù)訪問對象(DAOs)提供持續(xù)設(shè)施。這些DAOs實現(xiàn)可自定義,但普通提供了與關(guān)系數(shù)據(jù)庫交互。BPEL構(gòu)造運營時在實例級上是通過ODEJava并發(fā)對象(Jacob)框架實現(xiàn)。Jacob提供了一種應(yīng)用級不依賴于線程并發(fā)機制和一種提供執(zhí)行中斷與恢復(fù)透明機制。Jacob是Java實現(xiàn)ACTORS[Agha]并發(fā)模型中非常大一塊,其流程代數(shù)有許多功能,如\Pi–calculus。本質(zhì)上來說,Jacob為BPEL執(zhí)行提供了一種持久穩(wěn)固虛擬機。3.1.4ODE數(shù)據(jù)訪問對象(DAOs)ODE數(shù)據(jù)訪問對象作為BPEL引擎運營時與底層數(shù)據(jù)存儲間交互媒介。普通,數(shù)據(jù)存儲是一種JDBC關(guān)系數(shù)據(jù)庫:既然如此,那么DAOs就是使用OpenJPA數(shù)據(jù)訪問庫來實現(xiàn)。這樣就可以創(chuàng)立自定義DAO實現(xiàn),雖然JDBC沒有提供有關(guān)實現(xiàn),也能以某種機制達到持久化保存目。BPEL引擎運營時需要DAO對象來以解決如下持久化問題:(1)積極狀況下——懂得哪一種實例被創(chuàng)立;(2)消息路由——哪一種實例正在等待哪一條消息;(3)變量——每一種實例BPEL變量值;(4)合伙伙伴鏈接——每一種實例BPEL合伙伙伴連接值;(5)流程執(zhí)行狀態(tài)——Jacob持久穩(wěn)固虛擬機序列化狀態(tài)。關(guān)于OpenJPA/JDBCDAO實現(xiàn),和有關(guān)組織信息普通在FIGREF中提供。3.1.5ODE集成層ODEBPEL引擎運營時不能在真空中存在:它自己自身是不能影響與外部世界交往。為此它依賴于一種ODE集成層(ILs)。集成層將運營嵌入一種執(zhí)行環(huán)境。例如,有一種集成層AXIS2和JBI。集成層基本功能是為運營時提供通道間通信。AXIS2集成層使用AXIS2庫,讓運營時以Web服務(wù)方式與外加交互。JBL集成層則嘗試把運營時加入JBI消息總線達到同樣目。除了通訊以外,集成層還為運營時提供了線程管理機制,并管理運營時整個生命周期,例如配備和啟動運營時。3.2APACHEODE流程引擎JACOB框架3.2.1什么是JACOBJACOB,即JavaConcurrentObjects(Java并發(fā)對象),是APACHEODE引擎內(nèi)核框架。ODE依賴于JACOB框架去實現(xiàn)BPEL構(gòu)建。框架提供某些機制去解決兩個構(gòu)建BPEL核心問題:執(zhí)行狀態(tài)持久化,并發(fā)解決[17]。雖然是顧客只有一種線程,代碼也可以拆解成并發(fā)解決問題。通過把整個事務(wù)分解為某些較小某些,咱們就可以控制到那些真正被調(diào)用和執(zhí)行某些。例如說,咱們有一種按照如下順序來執(zhí)行一種過程:1.Invoke2.Receive3.Wait4.Invoke如果有兩個進程咱們需要同步解決,簡樸實現(xiàn)辦法是這樣:1.Invoke12.Receive13.Wait14.Invoke15.Invoke26.Receive27.Wait28.Invoke2但是如果咱們把代碼分解,引進一種所謂“中間人”(或者稱為棧),并且不容許活動直接地進行互相調(diào)用,咱們就有了如下調(diào)用順序:1.Invoke15.Invoke22.Receive13.Wait16.Receive27.Wait24.Invoke18.Invoke2從客戶角度來看,咱們就實現(xiàn)了運用單線程達到并發(fā)效果。在實際狀況中,某些活動也許會持續(xù)幾天,倘若進程發(fā)生錯誤時,進程執(zhí)行狀態(tài)就會丟失。因此用類似“掛起”這種能把執(zhí)行狀態(tài)保存在磁盤操作會更好。然而把進程"掛起"到磁盤上存在著某些實現(xiàn)上問題。在咱們但愿“掛起”時,調(diào)用棧看起來是這樣:Sequence.run()Wait.run()為了把進程保存到磁盤上,咱們需要終結(jié)當前控制進程,這就意味著要彈出所有棧構(gòu)造。要做到這些,咱們只有通過等待活動(Wait)和順序活動(Sequence)實現(xiàn)去迎合這種需求,因而帶來會是實現(xiàn)復(fù)雜限度增長。并且這也意味著所謂“自然”(即符合人們正常思維)模型不可以被直接使用。JACOB目的就是提供一種可選“自然”模型來解決這個問題。這個模型可以容許執(zhí)行狀態(tài)被掛起,但是卻不需要實現(xiàn)類(如wait,Sequence)等做出特別更改。JACOB思想就是不使用調(diào)用堆棧,而是以來自外部通信渠道(communicationchannel)來控制流程。3.2.2通道Channels如上所述,通道是用于流程執(zhí)行環(huán)境中活動通信接口。通道有終結(jié)通道(TerminationChannel),父事務(wù)范疇通道(ParentScopeChannel)和補償通道(CompensationChannel)等幾種。某些簡樸通道能使所有活動在創(chuàng)立時就能與其環(huán)境互相作用。當一種活動想要告知其父級活動她已經(jīng)結(jié)束執(zhí)行,那么這個活動就會調(diào)用其父級活動終結(jié)通道。通道重要由通道工廠(ChannelFactory)中動態(tài)合同提供。3.2.3Jacob對象(JacobObject)與Jacob可運營線程狀態(tài)(JacobRunnable)如果你不在乎細節(jié)話,那么Jacob對象和Jacob可運營線程狀態(tài)就是辦法實現(xiàn)。當抽象執(zhí)行時候,這個辦法就會執(zhí)行。一種Jacob對象就是一種閉包。維基百科對閉包有如下解釋:“一種閉包是一組由特定文法環(huán)境約束函數(shù)源碼。閉包文法變量與全局變量區(qū)別在于,她們并不出當前全局變量名空間。她們區(qū)別與面向?qū)ο髮ο笞兞吭谟?,她們約束于辦法,而不是對象。”普通而言Java語言并不支持閉包,因此Jacob對象嘗試解決這個問題。但Jacob對象解決方案并不是一種真正意義上閉包,而只是使問題變得簡樸些。閉包在Java語言中是靜態(tài)編碼,但是在其她大多數(shù)語言支持閉包是動態(tài)。因此在Jacob中,一種閉包應(yīng)當實現(xiàn)某些辦法,并提供其她公共辦法以控制通道和復(fù)制自身。Jacob可運營線程狀態(tài)就是一種實現(xiàn)了run()辦法Jacob對象。由于所有活動都繼承了Jacob可運營線程狀態(tài),因而這些活動都應(yīng)當在這個run()辦法中實現(xiàn)她們重要解決。她們初始化階段在各自構(gòu)造器中完畢。3.2.4辦法集MethodLists(MLs)辦法集MethodLists類可以看作是通道另一端。當只調(diào)用一種通道辦法時候,她們并不會被援引,但是一旦Jacob引擎把通道援引從其內(nèi)部堆棧中頂出來,就會援引辦法集(此處能再次看到執(zhí)行堆棧是如何被中斷)。普通辦法集實當前預(yù)引導(dǎo)執(zhí)行環(huán)境中是內(nèi)聯(lián),由于這樣比較容易在活動run辦法中聲明。對象辦法繼承于Jacob對象,這也是一種提交辦法集到Jacob辦法。因而該Jacob運營時就能匹配背面通道消息。3.2.5虛擬解決單元(VirtualProcessUnit)和執(zhí)行隊列(ExecutionQueue)虛擬解決單元VPU是所有Jacob解決發(fā)生地方。當一種Jacob對象被注入虛擬解決單元時候,她事實上被以為是一種持久化某些(Continuation),該某些包裹了調(diào)用Jacob對象并執(zhí)行該對象辦法(在咱們實例中,這總是run辦法,由于咱們只解決Jacob可運營線程狀態(tài)實例)。執(zhí)行隊列(ExecutionQueue,與其實現(xiàn)FastExecutionQueueImpl)是虛擬解決單元管理人工環(huán)境容器,并且將這些人工環(huán)境組織成可推入(push)可浮出(pop)隊列形式,同步記錄各項執(zhí)行記錄。因此虛擬解決單元重要功能是從SOUP中出列一種回應(yīng)(reaction),然后通過調(diào)用其抽象run辦法來執(zhí)行她(這個回應(yīng)包裹了這樣一種抽象)。然而當Jacob可運營線程狀態(tài)(普通是一種活動)被執(zhí)行后,有也許發(fā)生一下事情:(1)如果創(chuàng)立了別抽象,她們就會插入回應(yīng)隊列;(2)如果創(chuàng)立了新通道,她們就會被保存起來留給后來使用;(3)如果援引了別通道,該信息將被保存起來以與新ML匹配;(4)如果創(chuàng)立了一種新辦法集,那么她將被提交至虛擬解決單元以嘗試匹配一種channel援引。虛擬解決單元也負責維持其內(nèi)部狀態(tài)。因而當一種執(zhí)行暫停(例如咱們過程有一種接受活動)時候,虛擬解決單元狀態(tài)將序列化,作為一種持久化某些保存到磁盤,當收到繼續(xù)執(zhí)行時候再讀入此持久化某些,繼續(xù)執(zhí)行。這個邏輯可以參照RuntimeContextImplexecute辦法。尚有一點必須指出是,持久化某些(Jacob可運營線程狀態(tài)也是)不會“停留”在虛擬解決單元隊列中。她們只會浮出、執(zhí)行。因此如果一種抽象有持續(xù)并多于一種操作時候,她會簡樸執(zhí)行,生成子活動加入隊列。3.3實例解析While<processname="while1"targetNamespace="http://pxe/bpel/unit-test"xmlns:bpws=""xmlns=""xmlns:tns="http://pxe/bpel/unit-test"xmlns:xsd=""xmlns:test="http://pxe/bpel/unit-test.wsdl"suppressJoinFailure="yes"><partnerLinks><partnerLinkname="testPartnerLink"partnerLinkType="test:TestPartnerLinkType"myRole="me"/></partnerLinks><variables><variablename="var1"messageType="test:TestMessage2"/></variables><sequence><receivecreateInstance="yes"name="startReceive"partnerLink="testPartnerLink"portType="test:TestPortType"operation="testOperation"variable="var1"/><whilecondition="bpws:getVariableData('var1','TestPart')<;10"><assign><copy><fromexpression="bpws:getVariableData('var1','TestPart')+1"/><tovariable="var1"part="TestPart"/></copy></assign></while><replyname="endReply"operation="testOperation"partnerLink="testPartnerLink"portType="test:TestPortType"variable="var1"/></sequence></process>一切都從接受開始。因此咱們一方面從BpelProcess.PartnerLinkMyRoleImpl.inputMsgRcvd()開始討論Jacob-focused。如下是重要代碼(當信息到達實例時候開始執(zhí)行):BpelRuntimeContextImplinstance=createRuntimeContext(newInstance,newPROCESS(_oprocess),messageExchange);...//runthevpuinstance.execute();!BpelRuntimeContextImpl構(gòu)造器中有如下代碼:if(PROCESS!=null){vpu.inject(PROCESS);}這里注入了一種流程(Process)。當開始執(zhí)行時候,流程例示了她對其子活動執(zhí)行控制范疇,并且開始監(jiān)聽對消通道和完畢通道。從流程咱們可以得到范疇(Scope),然后是咱們主順序活動(Sequence),最后是咱們接受(Receive)。接受被映射到一種獲取消息PICK上,因而其Jacob實現(xiàn)寫在PICK中。PICK重要是分離出對的互有關(guān)系,再選取適當消息,然后等到消息。在實例中,咱們對\o"VisitpageoutsideConfluence"BpelRuntimeContextImpl.select()(andcalledbyPICK)中代碼更感興趣:if(_instantiatingMessageExchange!=null&&_dao.getState()==ProcessState.STATE_READY){for(inti=0;i<correlators.size();++i){CorrelatorDAOci=correlators.get(i);if(ci.equals(_dao.getInstantiatingCorrelator())){inputMsgMatch(pickResponseChannelStr,i,_instantiatingMessageExchange);return;}}}這里會調(diào)用類似如下東西:vpu.inject(newJacobRunnable(){publicvoidrun(){PickResponseChannelresponseChannel=importChannel(responsechannel,PickResponseChannel.class);responseChannel.onRequestRcvd(idx,mex);}};這里就是真正開始地方。當注入流程后,這個抽象會調(diào)用通道對接受活動反映。該通道另一端會作為一種辦法集在PICK中實現(xiàn)。object(false,newPickResponseML(_pickResponseChannel){publicvoidonRequestRcvd(intselectorIdx,Objectmsgex){...ActivityInfochild=newActivityInfo(genMonotonic(),onMessage.activity,_self.self,_self.parent);instance(createChild(child,_scopeFrame,_linkFrame));}});此辦法展示了接受活動必須做事情(例如變量和互有關(guān)系初始化等),并且創(chuàng)立子活動。當解決一種真實PICK時候,這一種子活動應(yīng)當處在獲取消息活動,然而對于一種接受活動來說,這是個空活動。因此咱們接受活動完畢了嗎?事實上,子活動完畢了。在子活動構(gòu)造器中,咱們傳遞了之前提供同一種父級活動范疇辦法集(ParentScopeML)。因而當子活動完畢時候,會告知該接受活動父活動,這就意味著接受活動自己自身并不需要去解決該問題。這樣一種空活動就立即完畢了:_pleted(null,CompensationHandler.emptySet());當onRequestRcvd()辦法結(jié)束后,會立即告知父序列。那咱們順序活動(Sequence)如何取回控制權(quán)呢?讓咱們再次回到通道另一端——辦法集上。解決通道援引和辦法集是虛擬解決單元最重要工作之一,順序化活動父級活動范疇實現(xiàn)如下:classSEQUENCEextendsACTIVITY{...privateclassACTIVEextendsBpelJacobRunnable{publicvoidrun(){...object(newParentScopeML(_child.parent){publicvoidcompensate(OScopescope,SynchChannelret){_pensate(scope,ret);instance(ACTIVE.this);}publicvoidcompleted(FaultDatafaultData,Set<CompensationHandler>compensations){HashSet<CompensationHandler>comps=newHashSet<CompensationHandler>(_compensations);comps.addAll(compensations);if(faultData!=null||_terminateRequested||_remaining.size()<=1){_pleted(faultData,comps);}else/*!fault&&!terminateRequested&&!remaining.isEmpty*/{ArrayList<OActivity>remaining=newArrayList<OActivity>(_remaining);remaining.remove(0);instance(newSEQUENCE(_self,_scopeFrame,_linkFrame,remaining,comps));}}}));}}...}completed()辦法理所固然會讓這個辦法執(zhí)行起來,除非拋出了一種錯誤、祈求了一種終端、沒有子活動余留。身為樂觀派,咱們應(yīng)當仔細檢查以確認一切正常,在第二個例子中,剩余活動被移除,然后順序活動抽象回到了本來位置,代碼如下:publicvoidrun(){finalActivityInfochild=newActivityInfo(genMonotonic(),_remaining.get(0),newChannel(TerminationChannel.class),newChannel(ParentScopeChannel.class));instance(createChild(child,_scopeFrame,_linkFrame));instance(newACTIVE(child));}如上代碼例示了下一種子活動抽象和另一種叫做ACTIVE抽象。那么這個ACTIVE抽象究竟是什么呢?她其實是一種用于持續(xù)跟隨執(zhí)行著子活動抽象,有點類似于PXE中基于所有容器(while,sequence,pick等等用于各種解決活動抽象)合同。那么一種ACTIVE(有時候也是等待器WAITER)抽象重要照顧其子活動。然后,咱們例示了一種條件重復(fù)活動(WHILE)抽象,這是順序活動(SEQUENCE)下一種子活動,那么接下來會發(fā)生什么事情呢?publicvoidrun(){booleancondResult=false;try{condResult=checkCondition();}catch(FaultExceptionfe){_pleted(createFault(fe.getQName(),_self.o),_compHandlers);return;}if(condResult){ActivityInfochild=newActivityInfo(genMonotonic(),getOWhile().activity,newChannel(TerminationChannel.class),newChannel(ParentScopeChannel.class));instance(createChild(child,_scopeFrame,_linkFrame));instance(newWAITER(child));}else/*stop.*/{_pleted(null,_compHandlers);}}當前咱們分析這些代碼。第一步是評估條件重復(fù)活動狀態(tài)。如果返回值為真(True),那么就創(chuàng)立一種子抽象,并且創(chuàng)立一種等待器(WAITER)去跟蹤她執(zhí)行。等待器實現(xiàn)如下,非常簡樸易懂:privateclassWAITERextendsBpelJacobRunnable{privateActivityInfo_child;privateboolean_terminated;WAITER(ActivityInfochild){_child=child;}publicvoidrun(){object(false,newTerminationML(_self.self){publicvoidterminate(){_terminated=true;_child.self.terminate();instance(WAITER.this);}}.or(newParentScopeML(_child.parent){publicvoidcompensate(OScopescope,SynchChannelret){_pensate(scope,ret);instance(WAITER.this);}publicvoidcompleted(FaultDatafaultData,Set<CompensationHandler>compensations){_compHandlers.addAll(compensations);if(_terminated||faultData!=null)_pleted(faultData,compensations);Elseinstance(WHILE.this);}}));}}終結(jié)符和補償符實際意義不大。例如順序活動完畢時候(Completion),重新例示了條件重復(fù)活動抽象。這也展示咱們解決循環(huán)辦法,即通過重新例示主條件重復(fù)活動抽象,再次評估狀況,如果為真則創(chuàng)立子活動。最后,如果條件重復(fù)活動浮現(xiàn)了假(False),那么她將告知其父級通道。順序活動將來到最后活動:答復(fù)活動(Reply)。答復(fù)活動回答各種可變內(nèi)容并告知她父集,這就是答復(fù)活動流程。然后咱們就可以說這整個流程已經(jīng)完畢了!是,咱們成功了!3.3本章小結(jié)本章講述了APACHEODE流程引擎架構(gòu),著重研究了ODE流程引擎運營時核心某些所采用機制,通過實例分析了一種流程實例在ODE流程引擎中詳細運營過程。為設(shè)計基于C++BPEL流程引擎奠定基本。
第四章提出基于C++特性BPEL引擎方案4.1JAVA和C++異同Java是純粹面相對象編程語言,C++設(shè)計成直接和廣泛支持各種程序設(shè)計風,兩者均有對象、繼承、多態(tài)特性,雖然體現(xiàn)形式上略有不同,但其實質(zhì)基本一致。Java特點之一就是\o"面向?qū)ο?面向?qū)ο螅浅绦蛟O(shè)計辦法一種。“面向?qū)ο蟪绦蛟O(shè)計語言”核心之一就是開發(fā)者在設(shè)計軟件時候可以使用自定義類型和關(guān)聯(lián)操作。代碼和數(shù)據(jù)實際集合體叫做“對象”。一種對象可以想象成綁定了諸多“行為(代碼)”和“狀態(tài)(數(shù)據(jù))”物體。對于數(shù)據(jù)構(gòu)造變化需要和代碼進行通信然后操作,反之亦然。面向?qū)ο笤O(shè)計讓大型軟件工程籌劃和設(shè)計變得更容易管理,能增強工程健康度,減少失敗工程數(shù)量。[9]面向?qū)ο笤O(shè)計此外一種目的就是能產(chǎn)生諸多關(guān)于聯(lián)類,可以讓軟件再開發(fā)變得簡樸。舉例來說,諸多軟件工程均有同樣功能,特別是諸多應(yīng)用了同一原理組織軟件工程。軟件二次開發(fā)者想自己為軟件開發(fā)插件以增強功能時候,絕對不想看到混亂開發(fā)代碼和管理籌劃。面向?qū)ο竽烤褪遣簧a(chǎn)難懂且難以使用代碼,為軟件各個功能群之間建立有效通信通道。諸多開源軟件社區(qū)正在籌劃給軟件作者提供更多類來讓軟件二次開發(fā)變得簡便。Java語言第二個特性就是跨平臺性,也就是說使用Java語言編寫程序可以在編譯后不用通過任何更改,就能在任何硬件設(shè)備條件下運營。這個特性經(jīng)常被稱為“一次編譯,處處運營”。[7]執(zhí)行Java應(yīng)用程序必要安裝JavaRuntimeEnvironment(JRE),JRE內(nèi)部有一種Java虛擬機器(JavaVirtualMachine,JVM)以及某些原則類別函式庫(ClassLibrary)。通過JVM虛擬機才干在電腦系統(tǒng)執(zhí)行Java應(yīng)用程序(JavaApplication),這與.NetFramework狀況同樣,因此電腦上沒有安裝JVM,那么這些程序?qū)⒉豢梢詧?zhí)行。實現(xiàn)跨平臺性辦法是大多數(shù)編譯器在進行Java語言程序編碼時候會生成一種用字節(jié)碼(Bytecode)寫成“半成品”,這個“半成品”會在Java虛擬機(解釋層)協(xié)助下運營,虛擬機會把它轉(zhuǎn)換成當前所處硬件平臺原始代碼。之后,Java虛擬機會打開原則庫,進行數(shù)據(jù)(圖片、線程和網(wǎng)絡(luò))存取工作。重要注意是,盡管已經(jīng)存在一種進行代碼翻譯解釋層,有些時候Java字節(jié)碼代碼還是會被JIT編譯器進行二次編譯。Java編程語言風格十分接近C++語言。繼承了C++語言面向?qū)ο蠹夹g(shù)核心,Java舍棄了C++語言中容易引起錯誤指針(以引用取代)、運算符重載(operatoroverloading)、多重繼承(以接口取代)等特性,增長了垃圾回收器功能用于回收不再被引用對象所占據(jù)內(nèi)存空間。眾所周知,在C++等某些需要維護內(nèi)存語言中,如何分派和釋放內(nèi)存是一種很讓程序員頭痛問題,特別是在有服務(wù)框架上,往往微小程序泄漏將會帶來巨大問題,Java垃圾回收機制較好協(xié)助程序員解決這個問題。Java有比較良好某些應(yīng)用框架,可以用來迅速搭建網(wǎng)絡(luò)應(yīng)用,例如對于公司級開發(fā),J2EE就是一種較好選取。C++特質(zhì)在于它高效性[8,10],它是直接和底層打交道語言,適合有較高運營效率和良好顧客體驗項目,這點Java程序支持并不好,并且往往在規(guī)定很高某些算法某些還會采用C和匯編等更底層語言來開發(fā)。C++特性還在于它面向?qū)ο蠓庋b,這點和Java是類似,但是它有兼有了C語言迅速高效特性,因此在開發(fā)類似游戲、搜索、大型應(yīng)用等項目時候,普通采用C++。但由于來自各個操作系統(tǒng)支持和底層API調(diào)用差別,C++在跨平臺項目開發(fā)中會遇到某些問題,兼容性方面并不上使用虛擬機JAVA語言。4.2基于C++BPEL流程引擎核心設(shè)計方案通過比較JAVA語言和C++語言,本節(jié)將從項目實際狀況出發(fā),依照C++語言特點提出設(shè)計思想與方案。4.2.1并發(fā)控制設(shè)計方案由第三章可以懂得,JACOB思想就是不使用嚴格意義上調(diào)用堆棧[5],而是以來自外部通信渠道(CommunicationChannel)[17]來控制流程。通信渠道機制在JACOB成功重要歸功于JAVA語言接口類別(interface)[9]。JAVA語言并不支持多重繼承特性,由于近年C++項目經(jīng)驗顯示,多重繼承雖然有非常強大功能,但是會讓系統(tǒng)構(gòu)造變得相稱臃腫復(fù)雜,使用起來非常困難。而接口則是種折中辦法,既提供了同樣功能,又不那么復(fù)雜。在設(shè)計基于C++BPEL引擎時,如果依然模仿JACOB設(shè)計思想,必要用多態(tài)機制來設(shè)計BPEL活動類及其所需通信渠道。由第二章可以懂得BPEL語言定義了十種基本活動和七種構(gòu)造化活動,慣用通信渠道有終結(jié)通道(TerminationChannel),父事務(wù)范疇通道(ParentScopeChannel)和補償通道(CompensationChannel)等幾種,此外如果后來需要擴展BPEL活動時候,也需要添加格外類,這會使得程序中存在過多類與繼承關(guān)系,讓程序變得過度復(fù)雜、困難。為了避免上述問題,咱們考慮使用調(diào)用堆棧來實現(xiàn)BPE引擎核心調(diào)度機制。也就是,咱們使用堆棧來維護運營時活動,把創(chuàng)立子活動、父活動范疇、告知父活動等功能在活動自身中實現(xiàn),由引擎虛擬解決單元來調(diào)用,這樣就把類似于JACOB通信渠道機制整合進活動詳細實現(xiàn)中。調(diào)用堆棧重要將通過類指針來進行調(diào)度,這樣會比使用引用和克隆JAVA語言版高效某些,但是在使用過程中必要注意非法指針、指針越界、程序健壯性等問題。調(diào)用堆棧在引擎中被稱作執(zhí)行隊列(ExecutionQueue),簡稱EQ。4.2.2C++多態(tài)機制在BPEL引擎中應(yīng)用除了封裝與繼承,C++還提供了多態(tài)(Polymorphism)功能[8,10],面向?qū)ο缶裨谟诙鄳B(tài)(Polymorphism),普通多態(tài),是指動態(tài)多態(tài),系使用繼承和動態(tài)綁定(DynamicBinding)實現(xiàn),使用多態(tài)可建立起繼承體系(Inheritancehierarchy)。類(class)與繼承只是達到多態(tài)中一種手段,因此稱面向?qū)ο蠖穷悓?dǎo)向。C++多態(tài)又提成靜態(tài)多態(tài)(StaticPolymorphism)與動態(tài)多態(tài)(DynamicPolymorphism)。動態(tài)多態(tài)必要結(jié)合繼承和動態(tài)綁定(DynamicBinding)方式實現(xiàn)。靜態(tài)多態(tài)是指以模板(template)實現(xiàn)多態(tài)辦法,也就是參數(shù)化型態(tài)(ParameterizedTypes),屬于編譯前(pre-compile)多態(tài),是使用宏(marco)“代碼膨脹法”達到多態(tài)效果。圖4.1BPEL活動類圖咱們使用繼承虛基類辦法實現(xiàn)BPEL活動多態(tài)。如圖4.1所示,咱們定義ACTIVITY作為BPEL活動基類,ACTIVITY基類擁有所有活動類型共有屬性,和虛函數(shù)RUN();所有BPEL活動類型都繼承ACTIVITY基類,并在各自類中實現(xiàn)構(gòu)造函數(shù)和RUN()函數(shù)。在調(diào)用堆棧中,咱們只使用ACTIVITY基類指針對堆棧中活動進行操作。C++提供了執(zhí)行期型態(tài)訊息(Runtimetypeinformation,RTTI)機制,讓C++指令達到動態(tài)指派(dynamic_cast)、型態(tài)標記符(typeid)操作解決能力,也就是說,依照RTTI,基類指針能通過虛函數(shù)表找到這個指針所指向內(nèi)存空間中實現(xiàn)了函數(shù),以實現(xiàn)用基類指針調(diào)用子類函數(shù)。那么,咱們就能把活動執(zhí)行抽象出來,讓解決單元就能專注于調(diào)用堆棧調(diào)度和管理。4.2.3基本活動解決圖4.2類調(diào)用序列圖執(zhí)行一種BPEL流程實例,事實上是調(diào)用由這個BPEL流程文獻編譯出來可執(zhí)行構(gòu)造。參照圖4.2,在咱們流程引擎里面,這是一種以PROCESS為根節(jié)點樹,因而要執(zhí)行這一種流程實例
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年籃球運動場地安全設(shè)施安裝與檢修合同3篇
- 2025版土地整治工程土方運輸居間代理協(xié)議3篇
- 2025版教育培訓(xùn)投資入股合同范本大全3篇
- 2025年度個人與個人車輛購置借款合同2篇
- 2025版教職工宿舍分配與使用管理合同3篇
- 二零二五版留置車輛維修工程借款協(xié)議4篇
- 2024金融科技支付系統(tǒng)集成與運營合同
- 二零二五年度體育賽事官方運動服贊助合同示例3篇
- 渣土運輸及循環(huán)經(jīng)濟承包合同(二零二五年度)3篇
- 2025年達人帶貨直播平臺合作協(xié)議書2篇
- 2024企業(yè)答謝晚宴會務(wù)合同3篇
- 《客艙安全管理與應(yīng)急處置》課件-第14講 應(yīng)急撤離
- 中華人民共和國文物保護法
- 節(jié)前物業(yè)安全培訓(xùn)
- 高甘油三酯血癥相關(guān)的器官損傷
- 手術(shù)室護士考試題及答案
- 牙膏項目創(chuàng)業(yè)計劃書
- 單位食堂供餐方案
- DB42-T 2204-2024 湖沼濕地溫室氣體通量監(jiān)測技術(shù)規(guī)范
- 急性會厭炎的護理
- 七年級下冊《Reading 1 A brave young man》優(yōu)質(zhì)課教案牛津譯林版-七年級英語教案
評論
0/150
提交評論