版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本科毕业设计(论文)阐明书基于C++BPEL流程引擎原型设计与实现学院软件学院专业软件工程学生姓名指引教师提交日期年6月3日华南理工大学毕业设计(论文)任务书兹发给班学生毕业设计(论文)任务书,内容如下:1.毕业设计(论文)题目:基于C++BPEL流程引擎原型设计与实现2.应完毕项目:(1)4月10日前拟定提纲并提交开题报告(2)5月25日前完毕论文草稿(3)进行基于C++BPEL引擎原型设计与开发(4)参照外文文献资料并提交外文翻译译文3.参照资料以及阐明:(1)杨开诚.数据构造[M].电子工业出版社.(9).(2)JamesGosling,BillJoy,GuySteeleandGiladBracha,TheJavalanguagespecificationthirdedition[M].Addison-Wesley,.(3)StanleyB.Lippman,JoséeLajoie,C++Primer,清华大学出版社.(4)杨洪波.BPEL4People思想解读[J].软件世界.(11).(5)万露.基于SOA和BPEL业务流程管理研究与应用[J].计算机与当代化.(8).(6)APACHEODE.(7)Jacob.(8)BoostSerialize.4.本毕业设计(论文)任务书于年月日发出,应于年月日前完毕,然后提交毕业考试委员会进行答辩。专业教研组(系)、研究所负责人审核年月日指引教师签发年月日
毕业设计(论文)评语:毕业设计(论文)总评成绩:毕业设计(论文)答辩负责人签字:年月日摘要本文详细简介了BPEL流程引擎以及流程管理系统理论知识与应用。由于当前几乎所有BPEL流程引擎核心都是基于JAVA语言编写,与操作系统底层交互限度较低,运营效率相对地下,在大规模应用上存在一定局限性。而C++语言重要特质之一就是高效,与操作系统底层交互良好。针对C++语言各自特点,和当前计算机软件界使用C++开发流程引擎空白,进一步提高流程引擎效率,本文提出了基于C++语言BPEL流程引擎原型设计方案,并对其进行了实现。流程引擎是运营通过编译可执行业务流程语言(普通是BPEL)定义文献核心某些,其重要三大功能分别是解析业务流程语言定义活动并运营、支持构造性活动、可以持久化地运营。而其中如何控制解决并发活动、如何持久化运营是流程引擎设计难点。只有解决了上述两个问题,流程引擎才干真正意义上具备实用价值。本文先对APACHEODE流程引擎核心(即JACOB)作了进一步详尽研究分析,对其解决并发活动所采用通信渠道机制和如何解决调度控制问题进行了详细阐明;然后给出了JAVA语言与C++语言异同,在此基本上指出使用C++语言开发流程引擎时需要注意重点,并据此提出了基于C++使用调用堆栈和BOOST序列化库来实现虚拟解决单元以及整个流程引擎设计方案和实现。成品测试表白,使用C++开发BPEL流程引擎是完全可行,整合了别的组件后可以实现完整流程管理系统,其实际运营状况令人满意。C++在Web时代依然有着很强生命力,使用C++开发流程引擎应当有辽阔发展前景。核心词:业务流程执行语言,业务流程引擎,虚拟解决单元
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国内外研究现状 21.3应解决重要问题及应达到技术规定 31.4本文组织构造 4第二章BPEL理论概述 52.1BPEL语言理论知识 52.1.1BPEL语言作用域 52.1.2BPEL活动原则属性和成员 52.1.3BPEL基本活动 62.1.4BPEL构造化活动 72.1.5其她构造化活动 72.2本章小结 8第三章关于ApacheODE流程引擎研究 93.1ApacheODE构造总览 93.1.1为什么选取参照ApacheODE流程引擎 103.1.2ODEBPEL编译器 103.1.3ODEBPEL引擎运营时 103.1.4ODE数据访问对象(DAOs) 103.1.5ODE集成层 113.2APACHEODE流程引擎JACOB框架 113.2.1什么是JACOB 113.2.2通道Channels 123.2.3Jacob对象(JacobObject)与Jacob可运营线程状态(JacobRunnable) 123.2.4办法集MethodLists(MLs) 133.2.5虚拟解决单元(VirtualProcessUnit)和执行队列(ExecutionQueue) 133.3实例解析 143.3本章小结 20第四章提出基于C++特性BPEL引擎方案 214.1JAVA和C++异同 214.2基于C++BPEL流程引擎核心设计方案 224.2.1并发控制设计方案 224.2.2C++多态机制在BPEL引擎中应用 234.2.3基本活动解决 244.2.4构造性活动解决 254.3本章小结 25第五章挂起与再启动 265.1为什么需要挂机与再启动 265.2序列化 265.2.1BoostSerialization 265.2.2BoostSerialization特点 265.2.3BoostSerialization使用 275.3本章小结 28第六章基于C++BPEL引擎原型设计与实现 296.1基于C++BPEL引擎重要模块设计与实现 296.1.1系统层次架构 296.1.2引擎运营时VPU模块实现 306.1.3引擎运营时执行队列模块实现 306.1.4BPEL引擎动态行为描述 316.1.5序列化实现 316.2系统应用实例 326.2.1Sequence实例 326.2.2Flow实例 366.3本章小结 39第七章结论 407.1结论 407.2存在局限性 40参照文献 41道谢 42附录 43绪论1.1研究背景和意义什么是业务流程?业务流程可以被定义为一种由各种不同功能活动相连一组有互有关系任务,它们依照一定业务逻辑和顺序依次执行。业务流程有起点和终点,并且它们都是可重复。业务流程是公司实现商务目的办法。对于公司而言,业务流程是公司重要知识资产,是公司核心竞争力体现,一种精心设计和执行业务流程可觉得公司创造价值并节约成本。在知名作家佛里德曼对经济全球化有着精彩阐述,它描绘了一种由互联网、通信基本设施和新型软件搭建全球舞台;在这个舞台上,人们可以以各种方式分享知识、劳动、娱乐和发现,并且创造新商业机会。“如今沃尔马是美国最大公司,然而它什么也不生产,只是建立了这个非凡供应环节,从世界各地进口非常便宜商品……并把世界各地产品送到消费者手里。它是一种全球组装线。”——《世界是平:21世纪简史》[1]。在经济全球化过程中,公司边界变得模糊,公司会将任务分解为一系列子任务,公司只关注于自己核心竞争力所在,并将其她工作分包给最适当人来完毕。公司需要通过业务流程将这些片断有机地组织在一起。在这里咱们可以深刻地结识到业务流程对公司重要性[2]。信息化产业中由此诞生了业务流程管理系统,其核心某些就是流程引擎。定义业务流程并对其做出文档所耗费时间和努力是完全值得。在一种反映中华人民共和国老式医学电视剧中,当配备药剂时候,掌柜把自己反锁在药房里,只有她会依照“秘方”将不同药材调配成救死扶伤灵药。然而只有她一人掌握这个过程是非常危险。对于当代公司来说这更是不也许,咱们不也许只让配件制造主任理解公司配件制造知识,然后让她每晚独自装配所有零件。只要定义了配件制造业务流程,配件制造工人可以随时来去,并且任何配件制造工人都可以随时取代另一种人工作,这是由于工厂里所有配件制造工人都理解并遵循业务流程。咱们可以学习、变化、评估,然后再次变化配件制造业务流程,由于该流程对于每个人都是可见,而非局限于配件制造主任。当代业务流程管理系统历史可以追溯到工作流系统[2]。业务流程管理系统是自本世纪初以来公司信息技术应用(信息化)背景上最重要和活跃概念之一。它有两方面基本含义或理解背景。一方面是公司管理,一方面是公司应用(软件、系统)。综合而言,它是典型,在公司应用强力推动下产生跨管理与信息技术领域流行概念之一。从管理角度,它可以看作是业务流程再造(BPR)所带来以业务流程为中心管理思想延续与发展;从公司应用角度,它是在工作流(Workflow)等技术基本上发展起来,基于业务流程建模,支持业务流程分析、建模、模仿、优化、协同与监控等功能新一代公司应用系统核心。简朴地来讲,工作流定义了业务流程中参加者(Who)、所执行工作(What)及何时执行(When)。在公司IT环境中,工作流软件普通与公司应用集成(EnterpriseApplicationIntegration,EAI)系统结合在一起,成为公司应用“黏合剂”,实现业务流程自动化和流水线化[2]。老式工作流系统最大缺陷就是:它们大多采用了专有技术。这使得业务流程与公司应用结合变得非常复杂,普通需要很长时间进行布置和实行,而与公司外部系统进行集成则更加困难,无法适应全球化浪潮和互联网时代对公司灵活、无缝集成需求。人们开始考虑运用Web服务开放性和原则化,来解决业务流程与公司应用之间互操作性问题。7月,IBM、微软、BEA提交了BusinessProcessExecutionLanguageforWebServices(BPEL4WS)1.0规范。业务流程执行语言基于XML和Web服务技术,它融合了初期IBMWebServicesFlowLanguage(WSFL)及微软XLANG规范诸多特点。随后许多重要供货商如SAP和Siebel(已被Oracle并购)等公司陆续加入规范制定,并催生了多项修改和改进,并于3月发布了1.1版。4月,BPEL被提交构造化信息原则增进组织(OASIS)以实现原则化,并组建了Web服务业务流程执行语言技术委员会(WSBPELTC),该努力使BPEL在业界获得更为广泛承认。当前该技术委员会正在致力于下一代规范制定工作,并将该规范重命名为WS-BPEL2.0。虽然除BPEL之外尚有某些业务流程规范,但是到当前为止,BPEL是最为成熟和被广泛支持技术[6,13,14]。“万维网其共通之原则让网络应用软件沟通无碍[1]”随着全球经济一体化,社会分工更加细致,业务流程管理系统应用广度与深度将越来越大。通过研究、摸索其核心某些,有助于提高笔者对新世纪计算机软件技术发展和当代公司软件结识。1.2国内外研究现状当前国外流行流程引擎重要有如下几种[15]:OSWworkFlow:是完全用java语言编写开放源代码工作流引擎,具备明显灵活性及完全面向有技术背景顾客特点。顾客可以依照自身需求运用这款开源软件设计简朴或是复杂工作流。JBPM:全称是JavaBusinessProcessManagement(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域一种开源、灵活、易扩展可执行流程语言框架。JBPM是公开源代码项目,它使用要遵循ApacheLicense,其最大特色就是它商务逻辑定义没有采用当前某些规范,如WMC、XPDL、BPML、ebXML、BPEL4WS等,而是采用了它自己定义JBossjBPMProcessdefinitionlanguage(jPdl)。jPdl以为一种商务流程可以被看作是一种UML状态图。jPdl就是详细定义了这个状态图每个某些,如起始、结束状态,状态之间转换,过图型化流程定义,直观地描述业务流程。APACHEODE(OrchestrationDirectorEngine):是基于Java开源WS-BPEL(简称BPEL)引擎,它于年7月18日从Apache孵化器中诞生成为一种顶级项目。它重要功能就是执行使用BPEL描述业务流程,实现业务流程自动化,它支持长期运营和短期运营过程。WebSphereProcessServer基于WebSphereApplicationServer和WebSphereEnterpriseServiceBus,它为面向服务体系构造(SOA)模块化应用程序提供了基本,并支持应用业务规则,以驱动支持业务流程应用程序。除此之外尚有BEAAquaLogic、OracleBPELProcessManager、IONAArtixOrchestration、ActiveBPEL、IntalioBPMS、MicrosoftBizTalkServer等等。在国内,重要是使用上述几种引擎做扩展、应用,研究流程引擎核心团队、组织、个人非常少。同步,当前所有商业流程引擎或开源流程引擎均使用Java或C#实现。之因此没有使用C++实现BPEL引擎,重要有三个因素:第一,普通电子商务应用,重要是在较底层ESB上提高性能,而不是处在上层BPM;第二,各大厂商为了使她们生产产品系列配套,依照其原有产品基本来设计实现BPEL引擎;第三,开源项目事实上也是各大厂商主导推动,为其产品改进提供活跃技术支持,因而采用与其产品有关构造。而C++语言相对其她语言具备性能上优势,因而本设计将采用C++语言来实现BPEL引擎,进一步提高BPEL引擎性能。1.3应解决重要问题及应达到技术规定BPEL引擎重要功能是执行业务流程,是BPM架构核心,其设计好坏、效率高低直接影响到整个BPM性能高低。[2,16]BPEL引擎重要功能是提供BPEL流程布置和运营环境。对于布置在BPEL引擎上业务流程,一方面解析流程文献生成数据对象构造,然后将数据对象构造序列化并保存。执行流程时候,将已保存数据对象构造反序列化,并依照流程中构造和活动执行相应操作,必要时将变量和流程执行状态持久化。执行流程时,BPEL引擎在与服务交互过程中扮演了两种角色:服务消费者和服务提供者,区别在于BPEL引擎是作为交互消息发起者或被发起者。交互消息类型有In-Only和In-Out两种,区别在于与否需要返回成果。实现BPEL引擎时应当注意这些区别。BPEL引擎核心——BPEL运营时,在执行流程中需要解决两个重要问题:第一,如何表达流程执行状态,以便需要时候挂起当前状态,等待重新启动。特别是对于需要长期运营流程,如果可以随时将流程当前执行状态通过数据持久化机制挂起保存,则可以避免进入长等待时由于浮现系统故障而丢失流程执行状态,无法恢复。第二,如何解决流程执行并发性管理问题。普通来说,创立一种流程实例都应当新建一种线程来执行。流程自身也支持并发操作flow,常规做法是为流程内并发操作新建线程执行。由于流程内并发操作数量不可知,有也许浮现线程泛滥甚至系统崩溃[12]。好做法应当是将并发性管理建立在每个流程实例占用单个线程基本之上,避免创立过多线程而带来线程调度对系统性能影响。1.4本文组织构造本文第一章简介了选题背景和意义。第二章将阐述与本课题有关计算机软件知识,提出本课题需要解决核心问题。第三章与第四章将阐明设计原理并进行方案选取。其中第三章将详细分析解说ApacheODE流程引擎核心某些,第四章将通过对JAVA语言和C++语言对比阐明设计原理并提出方案,阐明选取这个设计方案理由以及所采用方案特点。第五章与第六章将分点详细阐述设计,并进行成果分析。其中第五章将致力于解决如何表达流程执行状态问题;第六章将结合第四章详细阐述基于C++BPEL引擎设计与实现,致力于解决如何流程执行并发性管理问题。第七章将对整个研究工作进行归纳和综合,阐述本课题研究中尚存在问题及进一步开展研究看法和建议。
第二章BPEL理论概述2.1BPEL语言理论知识BPEL全称是业务流程可执行语言,用于描述业务流程。流程由一系列活动构成;通过作用域定义变量、合伙伙伴链接、有关集和事件响应解决逻辑等;通过合伙伙伴链接定义与流程交互其她服务;流程可以是有状态长时间运营过程,并且一种流程可以同步存在各种实例,流程引擎通过有关集将一条消息关联到特定流程实例。以上是BPEL描述业务流程基本状况,下面详细简介OASIS制定WS-BPEL2.0原则中定义各个元素,以便加深人们对BPEL理解。[6,14]2.1.1BPEL语言作用域作用域Scope提供影响其内部活动执行成果上下文环境,涉及变量Variable,合伙伙伴链接PartnerLink,消息交互MessageExchange,有关集CorrelationSet,事件解决EventHandler,异常解决FaultHandler,补偿解决CompensationHandler和终结解决TerminationHandler。作用域上下文环境可以多层次嵌套,父作用域中定义环境在子作用域中可见。每个流程根节点Process事实上就是一种顶层作用域。Process和Scope语法上是一致,但是她们有如下三点区别:Scope是一种活动而Process不是,活动原则属性和成员在Process中不合用;Scope中包括补偿解决和终结解决而Process中不容许包括;Scope中特有isolated隔离属性在Process中不合用。尽管Process和Scope有所区别,但BPEL引擎中对她们解决基本上是一致,可以以为Process是一种特殊Scope。每个Scope都包括一种主活动,定义该作用域业务逻辑,这个活动可以是一种复杂拥有任意层次嵌套构造化活动。其她上下文环境有关成员是可选。BPEL对Scope解决效率由主活动解决效率决定。2.1.2BPEL活动原则属性和成员在BPEL原则定义各种元素中,BPEL活动用于表达流程业务逻辑,可分为基本活动和构造化活动两种类型。基本活动描述流程业务单个环节实现,构造化活动则编码控制流逻辑,能递归包括其她基本活动或者构造化活动。业务流程执行事实上是BPEL活动执行,其她元素只是提供辅助BPEL活动实际执行过程中所需资源。依照BPEL原则提供各种基本活动和构造化活动多层次嵌套,可以定义任意复杂业务逻辑,从而实现所需业务功能。BPEL引擎对活动解析和执行效率决定了BPEL引擎效率。每个活动都包括两个原则可选属性,name和suppressJoinF属性指定流程中各个活动机器可读命名,用于区别不同活动。suppressJoinFailure是在并发解决Flow活动执行中定义与否屏蔽接合活动异常,详细详见Flow活动。每个活动都包括两个可选容器,sources和targets,分别存储原则成员source和target。source和target用于通过Flow活动中Link元素拟定并发解决活动同步关系,每个Link相应一种source活动和一种target活动,规定了在source活动执行结束之后,才容许target活动开始执行,保证了并发执行活动中某些活动同步关系。详细详见Flow活动中Link元素。2.1.3BPEL基本活动(1)Invoke——调用Web服务操作Invoke活动用于调用服务提供者提供Web服务,典型应用是调用Web服务上一种操作。Invoke可以在其补偿解决和异常解决中内联其她活动。依照WSDL文献定义,操作可以是祈求响应或者单向调用。BPEL原则对两种方式调用使用相似语法,单向调用方式只需提供输入变量或者输入输出变量都不提供,而祈求响应方式需要同步提供输入变量和输出变量。(2)Receive和Reply——提供Web服务操作Receive和Reply活动用于业务流程为其合伙伙伴提供服务。Receive等待合伙伙伴发送祈求消息,并依照createInstance属性决定与否创立流程实例。流程启动活动涉及Receive和Pick两种,流程必要以启动活动开始,其她活动控制依赖于启动活动,否则流程将无法执行。Receive是一种阻塞活动,只有流程实例接受到一种匹配消息该活动才会结束。Reply用于发送响应消息给之前通过Receive活动等接受祈求。这种响应只对祈求响应交互方式故意义。(3)Assign——更新变量和合伙伙伴链接Assign活动用于从一种变量到另一种变量复制数据,或者使用表达式操作变量、属性和常量来构造和插入新数据,或者在合伙伙伴链接之间复制端点引用。(4)Throw——抛出内部异常Throw活动用于显式抛出内部异常。Throw必要提供异常名称,可选提供更多异常有关信息,相应异常解决可以运用这些信息解决异常,并发布异常消息到需要其她服务。(5)Wait——延迟执行Wait活动用于指定一段特定期间延迟或者直到某个期限到来,当指定期间已过或者某个期限到来时,Wait活动立即结束。(6)Empty——什么事都不做Empty活动并不做任何事,但有些场合往往需要这样一种活动,例如一种异常需要被捕获或者禁止。Empty活动另一种用途是在并发Flow活动中提供一种同步点。(7)ExtensionActivity——增长活动类型ExtensionActivity活动用于引入BPEL原则未定义新活动。(8)Exit——及时终结流程执行Exit活动用于及时终结业务流程实例。除了终结解决、异常解决和补偿解决外,流程实例中所有当前正在运营活动都必要及时终结。(9)Rethrow——重新抛出已捕获异常Rethrow活动用于异常解决中重新抛出已捕获异常。Rethrow只能在异常解决Catch和CatchAll中使用。重新抛出异常包括信息是原始捕获到异常信息,而不是通过异常解决修改过信息。2.1.4BPEL构造化活动构造化活动规定了一组活动集合执行顺序。构造化活动以不同构造组合基本活动,表达不同控制流模式、异常解决、外部事件以及业务合同中流程实例之间消息交互协调。构造化活动可以以任意方式嵌套和组合。通过基本活动和构造化活动多层次嵌套,可以创立出表达任意复杂业务逻辑流程[4]。BPEL原则定义各种构造化活动,实现了不同控制流模式。BPEL原则定义构造化活动集合并不是最小集,有些状况下一种业务逻辑可以用不同活动来实现。例如一种顺序业务逻辑可以使用Sequence活动实现,也可以使用定义适当LinksFlow实现。而Sequence和Flow是BPEL构造化活动中最重要两个。(1)Sequence——顺序执行Sequence活动包括一种或各种按照浮现顺序先后执行子活动,当最后一种子活动执行结束时Sequence活动结束。(2)Flow——并行和控制依赖解决Flow活动提供并发和同步机制。Flow子活动并发执行,当所有子活动都结束时Flow才结束。子活动使能判断为假而跳过执行也以为该子活动结束。Flow同步启动各个子活动执行,其子活动各层次子活动之间也许存在同步依赖,因而Flow通过定义Link提供Flow内部各层次子活动之间同步依赖。每个活动均有可选sources和targets容器,分别包括一组source和target元素,这些元素通过Link拟定活动之间同步关系。一种Link分别相应一种source活动和target活动,规定在source活动执行结束之前target活动不容许开始执行。一种活动可以设立各种source,也可以设立各种target。targets容器中有个可选参数joinCondition定义各种target布尔组合方式,默认是或,即该活动相应各种source活动只要有一种完毕即可开始执行该活动。Link定义过程中不能形成控制环,即一种source活动相应target活动是其逻辑在前。2.1.5其她构造化活动除了Sequence和Flow,构造化活动尚有Pick(事件触发选取解决)、ForEach(遍历执行)、While、RepeatUntil(循环执行)、If、Elseif(选取执行)等等。此类构造化活动定义重要是为了能贴近人类语言,按照顾客指定表达式有选取地执行活动。她们表达式解析和条件鉴定由该活动自身执行办法解决,然后按照顾客定义,以串行或者并行方式来调度她们。咱们可以以为,在流程引擎内部,活动总是以串行或者并行方式进行调度和执行,对其她活动类型并不关怀。Sequence和Flow构造化活动是流程引擎重要工作模式和设计重点,实现了稳定可靠串行与并行控制机制,就能在此基本上执行其她构造化活动。因而,咱们把Sequence和Flow活动作为核心点进行研究。2.2本章小结 本章重要简介了BPEL语言基本理论,描述了BPEL基本活动与构造化活动原则属性和成员,并阐明了为什么SEQUENCE和FLOW是流程引擎解决核心活动类型。为下文铺开APACHEODE流程引擎设计,提出基于C++BPEL流程引擎原型设计方案中如何解决解决并发控制某些作理论知识简介。
第三章关于ApacheODE流程引擎研究ODE重要开发目的是开发可靠,构造紧凑,可嵌入组件,可以管理使用BPEL流程描述语言长时间运营业务流程执行。重点是开发具备最小依赖性小模块,以便重新组装成一种功能齐全业务流程管理系统。[4,16]3.1ApacheODE构造总览ODE架构中核心构成某些涉及BPEL编译器、ODEBPEL引擎运营时,ODE数据访问对象(DAOs),ODE集成层(ILs),和顾客工具[16]。编译器把BPEL文献转换成运营时可执行格式,运营时以一种可靠方式执行她们,并通过DAO层把她们保存起来;运营时在集成层中运营,集成层将BPEL引擎连接到更为辽阔外部执行环境。图3.1APACHEODE流程引擎架构图3.1.1为什么选取参照ApacheODE流程引擎为了研究流程引擎内部机制,必须研究学习其源代码,由于咱们一方面考虑开源项目。而在诸多开源项目中,ApacheODE流程引擎是严格按照BPEL原则制定,有详细规范文档可参阅项目之一。其她流程引擎,如JBPM,扩展了BPEL,加入了其她繁杂功能,增长了分析难度。因而选取参照ApacheODE引擎能抛开别的干扰,在其严格原则下研究流程引擎内部机制。3.1.2ODEBPEL编译器BPEL编译器负责把BPEL来源(即BPEL流程文献,WSDLs和schemas)编译成可执行形式。编译器输出成果不是一种“好”编译体现成果,也不是这些源文献错误信息列表。编译器生成成果是一种对象模型,类似于基本BPEL流程文献构造。但是,这种变异成果解决了BPEL中浮现各种名称引用(如变量名),内联了所需WSDL和类型信息,并生成了各种构造(如默认补偿解决)。这些编译成果(普通是一种扩展名为cbp文献)是BPEL运营所需唯一对象。3.1.3ODEBPEL引擎运营时ODEBPEL引擎运营时在BPEL运营时模块中建立,提供应BPEL流程执行。运营时提供了大量BPEL构造实现,以解决流程执行中最复杂繁琐工作。运营时同步也实现了何时应当创立新实例,和把刚收到消息分发给哪个实例逻辑。最后,运营时实现了流程管理API以供顾客工具使用。为了在不可靠环境中实现可靠执行过程,运营时依赖于数据访问对象(DAOs)提供持续设施。这些DAOs实现可自定义,但普通提供了与关系数据库交互。BPEL构造运营时在实例级上是通过ODEJava并发对象(Jacob)框架实现。Jacob提供了一种应用级不依赖于线程并发机制和一种提供执行中断与恢复透明机制。Jacob是Java实现ACTORS[Agha]并发模型中非常大一块,其流程代数有许多功能,如\Pi–calculus。本质上来说,Jacob为BPEL执行提供了一种持久稳固虚拟机。3.1.4ODE数据访问对象(DAOs)ODE数据访问对象作为BPEL引擎运营时与底层数据存储间交互媒介。普通,数据存储是一种JDBC关系数据库:既然如此,那么DAOs就是使用OpenJPA数据访问库来实现。这样就可以创立自定义DAO实现,虽然JDBC没有提供有关实现,也能以某种机制达到持久化保存目。BPEL引擎运营时需要DAO对象来以解决如下持久化问题:(1)积极状况下——懂得哪一种实例被创立;(2)消息路由——哪一种实例正在等待哪一条消息;(3)变量——每一种实例BPEL变量值;(4)合伙伙伴链接——每一种实例BPEL合伙伙伴连接值;(5)流程执行状态——Jacob持久稳固虚拟机序列化状态。关于OpenJPA/JDBCDAO实现,和有关组织信息普通在FIGREF中提供。3.1.5ODE集成层ODEBPEL引擎运营时不能在真空中存在:它自己自身是不能影响与外部世界交往。为此它依赖于一种ODE集成层(ILs)。集成层将运营嵌入一种执行环境。例如,有一种集成层AXIS2和JBI。集成层基本功能是为运营时提供通道间通信。AXIS2集成层使用AXIS2库,让运营时以Web服务方式与外加交互。JBL集成层则尝试把运营时加入JBI消息总线达到同样目。除了通讯以外,集成层还为运营时提供了线程管理机制,并管理运营时整个生命周期,例如配备和启动运营时。3.2APACHEODE流程引擎JACOB框架3.2.1什么是JACOBJACOB,即JavaConcurrentObjects(Java并发对象),是APACHEODE引擎内核框架。ODE依赖于JACOB框架去实现BPEL构建。框架提供某些机制去解决两个构建BPEL核心问题:执行状态持久化,并发解决[17]。虽然是顾客只有一种线程,代码也可以拆解成并发解决问题。通过把整个事务分解为某些较小某些,咱们就可以控制到那些真正被调用和执行某些。例如说,咱们有一种按照如下顺序来执行一种过程:1.Invoke2.Receive3.Wait4.Invoke如果有两个进程咱们需要同步解决,简朴实现办法是这样:1.Invoke12.Receive13.Wait14.Invoke15.Invoke26.Receive27.Wait28.Invoke2但是如果咱们把代码分解,引进一种所谓“中间人”(或者称为栈),并且不容许活动直接地进行互相调用,咱们就有了如下调用顺序:1.Invoke15.Invoke22.Receive13.Wait16.Receive27.Wait24.Invoke18.Invoke2从客户角度来看,咱们就实现了运用单线程达到并发效果。在实际状况中,某些活动也许会持续几天,倘若进程发生错误时,进程执行状态就会丢失。因此用类似“挂起”这种能把执行状态保存在磁盘操作会更好。然而把进程"挂起"到磁盘上存在着某些实现上问题。在咱们但愿“挂起”时,调用栈看起来是这样:Sequence.run()Wait.run()为了把进程保存到磁盘上,咱们需要终结当前控制进程,这就意味着要弹出所有栈构造。要做到这些,咱们只有通过等待活动(Wait)和顺序活动(Sequence)实现去迎合这种需求,因而带来会是实现复杂限度增长。并且这也意味着所谓“自然”(即符合人们正常思维)模型不可以被直接使用。JACOB目的就是提供一种可选“自然”模型来解决这个问题。这个模型可以容许执行状态被挂起,但是却不需要实现类(如wait,Sequence)等做出特别更改。JACOB思想就是不使用调用堆栈,而是以来自外部通信渠道(communicationchannel)来控制流程。3.2.2通道Channels如上所述,通道是用于流程执行环境中活动通信接口。通道有终结通道(TerminationChannel),父事务范畴通道(ParentScopeChannel)和补偿通道(CompensationChannel)等几种。某些简朴通道能使所有活动在创立时就能与其环境互相作用。当一种活动想要告知其父级活动她已经结束执行,那么这个活动就会调用其父级活动终结通道。通道重要由通道工厂(ChannelFactory)中动态合同提供。3.2.3Jacob对象(JacobObject)与Jacob可运营线程状态(JacobRunnable)如果你不在乎细节话,那么Jacob对象和Jacob可运营线程状态就是办法实现。当抽象执行时候,这个办法就会执行。一种Jacob对象就是一种闭包。维基百科对闭包有如下解释:“一种闭包是一组由特定文法环境约束函数源码。闭包文法变量与全局变量区别在于,她们并不出当前全局变量名空间。她们区别与面向对象对象变量在于,她们约束于办法,而不是对象。”普通而言Java语言并不支持闭包,因此Jacob对象尝试解决这个问题。但Jacob对象解决方案并不是一种真正意义上闭包,而只是使问题变得简朴些。闭包在Java语言中是静态编码,但是在其她大多数语言支持闭包是动态。因此在Jacob中,一种闭包应当实现某些办法,并提供其她公共办法以控制通道和复制自身。Jacob可运营线程状态就是一种实现了run()办法Jacob对象。由于所有活动都继承了Jacob可运营线程状态,因而这些活动都应当在这个run()办法中实现她们重要解决。她们初始化阶段在各自构造器中完毕。3.2.4办法集MethodLists(MLs)办法集MethodLists类可以看作是通道另一端。当只调用一种通道办法时候,她们并不会被援引,但是一旦Jacob引擎把通道援引从其内部堆栈中顶出来,就会援引办法集(此处能再次看到执行堆栈是如何被中断)。普通办法集实当前预引导执行环境中是内联,由于这样比较容易在活动run办法中声明。对象办法继承于Jacob对象,这也是一种提交办法集到Jacob办法。因而该Jacob运营时就能匹配背面通道消息。3.2.5虚拟解决单元(VirtualProcessUnit)和执行队列(ExecutionQueue)虚拟解决单元VPU是所有Jacob解决发生地方。当一种Jacob对象被注入虚拟解决单元时候,她事实上被以为是一种持久化某些(Continuation),该某些包裹了调用Jacob对象并执行该对象办法(在咱们实例中,这总是run办法,由于咱们只解决Jacob可运营线程状态实例)。执行队列(ExecutionQueue,与其实现FastExecutionQueueImpl)是虚拟解决单元管理人工环境容器,并且将这些人工环境组织成可推入(push)可浮出(pop)队列形式,同步记录各项执行记录。因此虚拟解决单元重要功能是从SOUP中出列一种回应(reaction),然后通过调用其抽象run办法来执行她(这个回应包裹了这样一种抽象)。然而当Jacob可运营线程状态(普通是一种活动)被执行后,有也许发生一下事情:(1)如果创立了别抽象,她们就会插入回应队列;(2)如果创立了新通道,她们就会被保存起来留给后来使用;(3)如果援引了别通道,该信息将被保存起来以与新ML匹配;(4)如果创立了一种新办法集,那么她将被提交至虚拟解决单元以尝试匹配一种channel援引。虚拟解决单元也负责维持其内部状态。因而当一种执行暂停(例如咱们过程有一种接受活动)时候,虚拟解决单元状态将序列化,作为一种持久化某些保存到磁盘,当收到继续执行时候再读入此持久化某些,继续执行。这个逻辑可以参照RuntimeContextImplexecute办法。尚有一点必须指出是,持久化某些(Jacob可运营线程状态也是)不会“停留”在虚拟解决单元队列中。她们只会浮出、执行。因此如果一种抽象有持续并多于一种操作时候,她会简朴执行,生成子活动加入队列。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。如下是重要代码(当信息到达实例时候开始执行):BpelRuntimeContextImplinstance=createRuntimeContext(newInstance,newPROCESS(_oprocess),messageExchange);...//runthevpuinstance.execute();!BpelRuntimeContextImpl构造器中有如下代码:if(PROCESS!=null){vpu.inject(PROCESS);}这里注入了一种流程(Process)。当开始执行时候,流程例示了她对其子活动执行控制范畴,并且开始监听对消通道和完毕通道。从流程咱们可以得到范畴(Scope),然后是咱们主顺序活动(Sequence),最后是咱们接受(Receive)。接受被映射到一种获取消息PICK上,因而其Jacob实现写在PICK中。PICK重要是分离出对的互有关系,再选取适当消息,然后等到消息。在实例中,咱们对\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;}}}这里会调用类似如下东西:vpu.inject(newJacobRunnable(){publicvoidrun(){PickResponseChannelresponseChannel=importChannel(responsechannel,PickResponseChannel.class);responseChannel.onRequestRcvd(idx,mex);}};这里就是真正开始地方。当注入流程后,这个抽象会调用通道对接受活动反映。该通道另一端会作为一种办法集在PICK中实现。object(false,newPickResponseML(_pickResponseChannel){publicvoidonRequestRcvd(intselectorIdx,Objectmsgex){...ActivityInfochild=newActivityInfo(genMonotonic(),onMessage.activity,_self.self,_self.parent);instance(createChild(child,_scopeFrame,_linkFrame));}});此办法展示了接受活动必须做事情(例如变量和互有关系初始化等),并且创立子活动。当解决一种真实PICK时候,这一种子活动应当处在获取消息活动,然而对于一种接受活动来说,这是个空活动。因此咱们接受活动完毕了吗?事实上,子活动完毕了。在子活动构造器中,咱们传递了之前提供同一种父级活动范畴办法集(ParentScopeML)。因而当子活动完毕时候,会告知该接受活动父活动,这就意味着接受活动自己自身并不需要去解决该问题。这样一种空活动就立即完毕了:_pleted(null,CompensationHandler.emptySet());当onRequestRcvd()办法结束后,会立即告知父序列。那咱们顺序活动(Sequence)如何取回控制权呢?让咱们再次回到通道另一端——办法集上。解决通道援引和办法集是虚拟解决单元最重要工作之一,顺序化活动父级活动范畴实现如下: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()办法理所固然会让这个办法执行起来,除非抛出了一种错误、祈求了一种终端、没有子活动余留。身为乐观派,咱们应当仔细检查以确认一切正常,在第二个例子中,剩余活动被移除,然后顺序活动抽象回到了本来位置,代码如下:publicvoidrun(){finalActivityInfochild=newActivityInfo(genMonotonic(),_remaining.get(0),newChannel(TerminationChannel.class),newChannel(ParentScopeChannel.class));instance(createChild(child,_scopeFrame,_linkFrame));instance(newACTIVE(child));}如上代码例示了下一种子活动抽象和另一种叫做ACTIVE抽象。那么这个ACTIVE抽象究竟是什么呢?她其实是一种用于持续跟随执行着子活动抽象,有点类似于PXE中基于所有容器(while,sequence,pick等等用于各种解决活动抽象)合同。那么一种ACTIVE(有时候也是等待器WAITER)抽象重要照顾其子活动。然后,咱们例示了一种条件重复活动(WHILE)抽象,这是顺序活动(SEQUENCE)下一种子活动,那么接下来会发生什么事情呢?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);}}当前咱们分析这些代码。第一步是评估条件重复活动状态。如果返回值为真(True),那么就创立一种子抽象,并且创立一种等待器(WAITER)去跟踪她执行。等待器实现如下,非常简朴易懂: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);}}));}}终结符和补偿符实际意义不大。例如顺序活动完毕时候(Completion),重新例示了条件重复活动抽象。这也展示咱们解决循环办法,即通过重新例示主条件重复活动抽象,再次评估状况,如果为真则创立子活动。最后,如果条件重复活动浮现了假(False),那么她将告知其父级通道。顺序活动将来到最后活动:答复活动(Reply)。答复活动回答各种可变内容并告知她父集,这就是答复活动流程。然后咱们就可以说这整个流程已经完毕了!是,咱们成功了!3.3本章小结本章讲述了APACHEODE流程引擎架构,着重研究了ODE流程引擎运营时核心某些所采用机制,通过实例分析了一种流程实例在ODE流程引擎中详细运营过程。为设计基于C++BPEL流程引擎奠定基本。
第四章提出基于C++特性BPEL引擎方案4.1JAVA和C++异同Java是纯粹面相对象编程语言,C++设计成直接和广泛支持各种程序设计风,两者均有对象、继承、多态特性,虽然体现形式上略有不同,但其实质基本一致。Java特点之一就是\o"面向对象"面向对象,是程序设计办法一种。“面向对象程序设计语言”核心之一就是开发者在设计软件时候可以使用自定义类型和关联操作。代码和数据实际集合体叫做“对象”。一种对象可以想象成绑定了诸多“行为(代码)”和“状态(数据)”物体。对于数据构造变化需要和代码进行通信然后操作,反之亦然。面向对象设计让大型软件工程筹划和设计变得更容易管理,能增强工程健康度,减少失败工程数量。[9]面向对象设计此外一种目的就是能产生诸多关于联类,可以让软件再开发变得简朴。举例来说,诸多软件工程均有同样功能,特别是诸多应用了同一原理组织软件工程。软件二次开发者想自己为软件开发插件以增强功能时候,绝对不想看到混乱开发代码和管理筹划。面向对象目就是不生產难懂且难以使用代码,为软件各个功能群之间建立有效通信通道。诸多开源软件社区正在筹划给软件作者提供更多类来让软件二次开发变得简便。Java语言第二个特性就是跨平台性,也就是说使用Java语言编写程序可以在编译后不用通过任何更改,就能在任何硬件设备条件下运营。这个特性经常被称为“一次编译,处处运营”。[7]执行Java应用程序必要安装JavaRuntimeEnvironment(JRE),JRE内部有一种Java虚拟机器(JavaVirtualMachine,JVM)以及某些原则类别函式库(ClassLibrary)。通过JVM虚拟机才干在电脑系统执行Java应用程序(JavaApplication),这与.NetFramework状况同样,因此电脑上没有安装JVM,那么这些程序将不可以执行。实现跨平台性办法是大多数编译器在进行Java语言程序编码时候会生成一种用字节码(Bytecode)写成“半成品”,这个“半成品”会在Java虚拟机(解释层)协助下运营,虚拟机会把它转换成当前所处硬件平台原始代码。之后,Java虚拟机会打开原则库,进行数据(图片、线程和网络)存取工作。重要注意是,尽管已经存在一种进行代码翻译解释层,有些时候Java字节码代码还是会被JIT编译器进行二次编译。Java编程语言风格十分接近C++语言。继承了C++语言面向对象技术核心,Java舍弃了C++语言中容易引起错误指针(以引用取代)、运算符重载(operatoroverloading)、多重继承(以接口取代)等特性,增长了垃圾回收器功能用于回收不再被引用对象所占据内存空间。众所周知,在C++等某些需要维护内存语言中,如何分派和释放内存是一种很让程序员头痛问题,特别是在有服务框架上,往往微小程序泄漏将会带来巨大问题,Java垃圾回收机制较好协助程序员解决这个问题。Java有比较良好某些应用框架,可以用来迅速搭建网络应用,例如对于公司级开发,J2EE就是一种较好选取。C++特质在于它高效性[8,10],它是直接和底层打交道语言,适合有较高运营效率和良好顾客体验项目,这点Java程序支持并不好,并且往往在规定很高某些算法某些还会采用C和汇编等更底层语言来开发。C++特性还在于它面向对象封装,这点和Java是类似,但是它有兼有了C语言迅速高效特性,因此在开发类似游戏、搜索、大型应用等项目时候,普通采用C++。但由于来自各个操作系统支持和底层API调用差别,C++在跨平台项目开发中会遇到某些问题,兼容性方面并不上使用虚拟机JAVA语言。4.2基于C++BPEL流程引擎核心设计方案通过比较JAVA语言和C++语言,本节将从项目实际状况出发,依照C++语言特点提出设计思想与方案。4.2.1并发控制设计方案由第三章可以懂得,JACOB思想就是不使用严格意义上调用堆栈[5],而是以来自外部通信渠道(CommunicationChannel)[17]来控制流程。通信渠道机制在JACOB成功重要归功于JAVA语言接口类别(interface)[9]。JAVA语言并不支持多重继承特性,由于近年C++项目经验显示,多重继承虽然有非常强大功能,但是会让系统构造变得相称臃肿复杂,使用起来非常困难。而接口则是种折中办法,既提供了同样功能,又不那么复杂。在设计基于C++BPEL引擎时,如果依然模仿JACOB设计思想,必要用多态机制来设计BPEL活动类及其所需通信渠道。由第二章可以懂得BPEL语言定义了十种基本活动和七种构造化活动,惯用通信渠道有终结通道(TerminationChannel),父事务范畴通道(ParentScopeChannel)和补偿通道(CompensationChannel)等几种,此外如果后来需要扩展BPEL活动时候,也需要添加格外类,这会使得程序中存在过多类与继承关系,让程序变得过度复杂、困难。为了避免上述问题,咱们考虑使用调用堆栈来实现BPE引擎核心调度机制。也就是,咱们使用堆栈来维护运营时活动,把创立子活动、父活动范畴、告知父活动等功能在活动自身中实现,由引擎虚拟解决单元来调用,这样就把类似于JACOB通信渠道机制整合进活动详细实现中。调用堆栈重要将通过类指针来进行调度,这样会比使用引用和克隆JAVA语言版高效某些,但是在使用过程中必要注意非法指针、指针越界、程序健壮性等问题。调用堆栈在引擎中被称作执行队列(ExecutionQueue),简称EQ。4.2.2C++多态机制在BPEL引擎中应用除了封装与继承,C++还提供了多态(Polymorphism)功能[8,10],面向对象精神在于多态(Polymorphism),普通多态,是指动态多态,系使用继承和动态绑定(DynamicBinding)实现,使用多态可建立起继承体系(Inheritancehierarchy)。类(class)与继承只是达到多态中一种手段,因此称面向对象而非类导向。C++多态又提成静态多态(StaticPolymorphism)与动态多态(DynamicPolymorphism)。动态多态必要结合继承和动态绑定(DynamicBinding)方式实现。静态多态是指以模板(template)实现多态办法,也就是参数化型态(ParameterizedTypes),属于编译前(pre-compile)多态,是使用宏(marco)“代码膨胀法”达到多态效果。图4.1BPEL活动类图咱们使用继承虚基类办法实现BPEL活动多态。如图4.1所示,咱们定义ACTIVITY作为BPEL活动基类,ACTIVITY基类拥有所有活动类型共有属性,和虚函数RUN();所有BPEL活动类型都继承ACTIVITY基类,并在各自类中实现构造函数和RUN()函数。在调用堆栈中,咱们只使用ACTIVITY基类指针对堆栈中活动进行操作。C++提供了执行期型态讯息(Runtimetypeinformation,RTTI)机制,让C++指令达到动态指派(dynamic_cast)、型态标记符(typeid)操作解决能力,也就是说,依照RTTI,基类指针能通过虚函数表找到这个指针所指向内存空间中实现了函数,以实现用基类指针调用子类函数。那么,咱们就能把活动执行抽象出来,让解决单元就能专注于调用堆栈调度和管理。4.2.3基本活动解决图4.2类调用序列图执行一种BPEL流程实例,事实上是调用由这个BPEL流程文献编译出来可执行构造。参照图4.2,在咱们流程引擎里面,这是一种以PROCESS为根节点树,因而要执行这一种流程实例
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 68083号工程:2024年锅炉安装作业协议版B版
- 2024年长期雇佣工人合同
- 综合2024年度林地生态旅游合作协议
- 2024智能家居系统集成服务协议
- 2024版钢管采购合同
- 2024年餐饮厨师合同范本
- 2025年度企业研发项目原材料采购与合同执行监督协议3篇
- 2024房贷偿还细则协议一
- 2024老旧堡坎重建及维护服务协议
- 2025年度林业信息化建设承包合同2篇
- 教科版(2024秋)六年级上册1.各种形式的能量 教案
- 2024年文物遗址保护服务项目合作计划书
- 安全员岗位竞聘课件
- 北京市通州区2023-2024学年高三上学期期末考试政治试题 含解析
- 房屋代持协议协议书2024年
- 2024至2030年中国船供油行业市场竞争现状及发展趋势分析报告
- 2025年中考英语热点时文阅读-发明创造附解析
- 反诉状(业主反诉物业)(供参考)
- 《飞机载重平衡》-课件:认知配载工作流程
- 装饰材料与施工工艺智慧树知到答案2024年泉州华光职业学院
- 大学生心理健康教育常见困扰与自我调适智慧树知到期末考试答案章节答案2024年浙江师范大学
评论
0/150
提交评论