




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
哈爾濱工業(yè)大學(xué)計(jì)算機(jī)學(xué)院唐好選Email:tanghx@CORBA構(gòu)件模型及
構(gòu)件接口語言
主要內(nèi)容RPC的基本原理CORBA的概念與組成CORBA構(gòu)件模型RPC的基本原理NetworkLocalCallClientStubRPCInterfaceRPCInterfaceServerStubRemoteProceduresendreceivesendreceive客戶端程序服務(wù)器端程序RPC過程描述1、客戶按本地調(diào)用的方式 直接調(diào)用本地的客戶代理 客戶代理具有與服務(wù)器相同的過程接口2、客戶代理將客戶的調(diào)用請(qǐng)求進(jìn)行加工、打包 向底層通信機(jī)制(如套接字)發(fā)出請(qǐng)求消息
客戶代理 不進(jìn)行任何邏輯處理 只是一個(gè)中介3、客戶端通過底層的通信機(jī)制 將消息傳送給服務(wù)器端的底層通信機(jī)制RPC過程描述4、服務(wù)器需要部分地解析消息 找出客戶希望調(diào)用的服務(wù)器程序5、服務(wù)器代理對(duì)消息進(jìn)行解析 從中獲得調(diào)用者的參數(shù) 然后調(diào)用服務(wù)器程序6、服務(wù)器程序執(zhí)行相應(yīng)的過程7、服務(wù)器程序?qū)⒔Y(jié)果返回給服務(wù)器代理8、服務(wù)器代理將結(jié)果打包 向底層通信機(jī)制發(fā)出應(yīng)答消息9、服務(wù)器端通信機(jī)制將消息傳送給客戶端通信機(jī)制RPC過程描述10、客戶端節(jié)點(diǎn)上也可能有多個(gè)調(diào)出點(diǎn) 通信機(jī)制需要部分地解析返回的消息 找出消息應(yīng)該返回給哪個(gè)客戶程序 并將消息發(fā)送給對(duì)應(yīng)的客戶代理11、客戶代理從消息中解析結(jié)果 返回給客戶程序客戶端開發(fā)過程服務(wù)器端開發(fā)過程服務(wù)器端程序IDL編譯器(rpcgen)客戶端程序IDLaccount.haccount_clnt.caccount_svc.cserver.cclient.crpclib.o互操作接口定義語言互操作協(xié)議
互操作實(shí)現(xiàn)(以RPC為例)互操作查找互操作規(guī)范底層協(xié)議決定決定服務(wù)器端程序客戶端程序客戶端代理互操作消息網(wǎng)絡(luò)基礎(chǔ)設(shè)施服務(wù)器端代理互操作消息網(wǎng)絡(luò)基礎(chǔ)設(shè)施CORBA的概念與組成CORBA概述CORBA(CommonObjectRequestBrokerArchitecture公共對(duì)象請(qǐng)求代理體系結(jié)構(gòu))是OMG制定的、最清晰的、跨越平臺(tái)最多的分布對(duì)象模型通過IDL(InterfaceDefinitionLanguage)定義的接口,使用不同的編程語言,不同編譯器實(shí)現(xiàn)的構(gòu)件,可以通過對(duì)象請(qǐng)求代理(ORB:ObjectRequestBroker)連接,形成跨平臺(tái)的應(yīng)用CORBA是一套規(guī)約,而不是一個(gè)產(chǎn)品,開發(fā)商可以開發(fā)不同的產(chǎn)品來實(shí)現(xiàn)CORBA規(guī)約CORBA歷史OMG成立于1989年,CORBA規(guī)約的第一代主要集中在為分布式對(duì)象定義了一個(gè)基礎(chǔ),其核心是ORB和IDL1995年頒布的CORBA2.0增加了ORB的互操作性規(guī)約,主要是基于TCP/IP的IIOP(InternetInter-ORBProtocol:因特網(wǎng)ORB互聯(lián)協(xié)議)1997年頒布的CORBA2.1增加了COM/CORBA互操作規(guī)范1998年頒布的CORBA2.2增加了移植性的對(duì)象適配器(POA:PortableObjectAdapter)和IDL到Java語言的映射規(guī)約,OMA中增加了領(lǐng)域接口部分2001年頒布的CORBA3.0增加了CCM(CORBAComponentModel:CORBA構(gòu)件模型),提供容器作為構(gòu)件的運(yùn)行環(huán)境CORBA的組成客戶程序Client對(duì)象實(shí)現(xiàn)Server動(dòng)態(tài)調(diào)用客戶IDL存根ORB接口動(dòng)態(tài)框架接口靜態(tài)框架接口對(duì)象適配器對(duì)象請(qǐng)求中間件核心(ORBCore)接口倉庫實(shí)現(xiàn)庫CORBA的基準(zhǔn)模型對(duì)象請(qǐng)求代理(ORB)對(duì)象服務(wù)應(yīng)用對(duì)象公共設(shè)施基準(zhǔn)模型描述了分布式對(duì)象系統(tǒng)的基本成分(1)CORBAService(對(duì)象服務(wù))是一組系統(tǒng)級(jí)對(duì)象,為實(shí)現(xiàn)和管理對(duì)象提供了基本功能,包括名字、生存周期服務(wù)、事務(wù)服務(wù)、安全服務(wù)等(2)ORB是核心,它提供了一種機(jī)制,使得對(duì)象可以透明的發(fā)送請(qǐng)求和接受響應(yīng)ORB與對(duì)象服務(wù)相結(jié)合,確保符合CORBA基準(zhǔn)的應(yīng)用構(gòu)件之間有效的通信(3)CORBAFacilities(公共設(shè)施)是適用于眾多應(yīng)用領(lǐng)域的通用構(gòu)件,例如信息管理、系統(tǒng)管理、任務(wù)管理和用戶界面等(4)ApplicationObject(應(yīng)用對(duì)象)是專用于特定領(lǐng)域的構(gòu)件CORBA的基準(zhǔn)模型(續(xù))對(duì)象類的上下文關(guān)系ORB的體系結(jié)構(gòu)接口倉庫IDL編譯程序?qū)崿F(xiàn)倉庫客戶機(jī)對(duì)象實(shí)現(xiàn)GIOP/IIOPDII客戶代理ORB內(nèi)核ORB接口Operation()輸入?yún)?shù)輸出參數(shù)+返回值對(duì)象適配器實(shí)現(xiàn)骨架DSIORB體系結(jié)構(gòu)定義一個(gè)描述客戶機(jī)如何向遠(yuǎn)程對(duì)象發(fā)送請(qǐng)求并得到回答的框架ORB的職責(zé)ORB給分布式對(duì)象提供了透明發(fā)送請(qǐng)求和接受響應(yīng)的機(jī)制,主要包括以下職責(zé):負(fù)責(zé)根據(jù)客戶機(jī)給出的對(duì)象引用定位相應(yīng)的遠(yuǎn)程對(duì)象實(shí)現(xiàn),激活遠(yuǎn)程對(duì)象實(shí)現(xiàn),建立與遠(yuǎn)程對(duì)象實(shí)現(xiàn)的連接客戶端ORB接受客戶機(jī)請(qǐng)求的參數(shù),將參數(shù)打包,通過ORB互聯(lián)協(xié)議(如IIOP協(xié)議)跨網(wǎng)絡(luò)送給服務(wù)器端的ORB服務(wù)器端的ORB接受通過ORB互聯(lián)協(xié)議跨網(wǎng)絡(luò)傳送過來的參數(shù),并將這些參數(shù)解包,發(fā)送給對(duì)象實(shí)現(xiàn)負(fù)責(zé)將對(duì)象實(shí)現(xiàn)響應(yīng)客戶機(jī)的請(qǐng)求后的輸出參數(shù)、返回值等,以同樣的打包/解包方式,傳回給客戶機(jī)ORB內(nèi)核和ORB接口ORB內(nèi)核提供了對(duì)象的通用表示和對(duì)象間通信的機(jī)制??蛻艉蛯?duì)象實(shí)現(xiàn)通過ORB接口的形式訪問ORB內(nèi)核提供的功能ORB接口是客戶與對(duì)象實(shí)現(xiàn)可以直接訪問到的、抽象描述ORB操作的接口,ORB接口由ORB內(nèi)核實(shí)現(xiàn),它不倚賴于任何的對(duì)象適配器,ORB接口主要包括:ORB初始化(ORB-init)獲取初始對(duì)象引用對(duì)象引用操作策略域的管理線程有關(guān)的操作ORB的實(shí)現(xiàn)方式
位于客戶和對(duì)象實(shí)現(xiàn)內(nèi)部的ORB
基于服務(wù)器的ORB基于系統(tǒng)的ORBORB的對(duì)象適配器OAOA是對(duì)象實(shí)現(xiàn)訪問ORB所提供服務(wù)的主要方式,由于對(duì)象實(shí)現(xiàn)方式不同,ORB內(nèi)核很難為所有對(duì)象提供方便有效的單一接口,通過OA,ORB可以定制接口,為一組特定的對(duì)象實(shí)現(xiàn)提供服務(wù),OA負(fù)責(zé)的主要功能有:生成和解釋對(duì)象引用,方法調(diào)用、注冊(cè)、激活和凍結(jié)對(duì)象實(shí)現(xiàn),將對(duì)象引用映射到相應(yīng)的對(duì)象實(shí)現(xiàn)BOA(基本對(duì)象適配器)著重CORBA服務(wù)器實(shí)現(xiàn)POA(可移植對(duì)象適配器)規(guī)約將CORBA對(duì)象定義為具有標(biāo)識(shí)、接口和實(shí)現(xiàn)的抽象實(shí)體,負(fù)責(zé)把CORBA對(duì)象概念適配為編程語言的服務(wù)體(Servant)概念,允許編程人員構(gòu)造可移植的對(duì)象實(shí)現(xiàn)對(duì)象適配器ORB通過對(duì)象適配器提供的服務(wù)通常包括生成和解釋對(duì)象引用方法調(diào)用交互的安全性對(duì)象和實(shí)現(xiàn)的激活及凍結(jié)將對(duì)象引用映射到實(shí)現(xiàn)注冊(cè)實(shí)現(xiàn)對(duì)象粒度、壽命、策略、實(shí)現(xiàn)風(fēng)格等的明顯區(qū)別使得
ORB核心很難為所有對(duì)象提供方便和有效的單一接口通過對(duì)象適配器
ORB可以將一組特定的對(duì)象實(shí)現(xiàn)作為目標(biāo)對(duì)象適配器的作用ORB的接口倉庫和實(shí)現(xiàn)倉庫接口倉庫(InterfaceRepository:IR)是儲(chǔ)存、發(fā)布、管理相關(guān)對(duì)象接口定義的集合,通常以IDL文件作為輸入,將接口描述信息經(jīng)過處理后存放在文件、數(shù)據(jù)庫或者其它形式的存儲(chǔ)機(jī)制中,并提供一組標(biāo)準(zhǔn)的調(diào)用接口供運(yùn)行時(shí)動(dòng)態(tài)查詢實(shí)現(xiàn)倉庫包含了允許ORB激活和定位對(duì)象實(shí)現(xiàn)的信息,一般來說,對(duì)象實(shí)現(xiàn)的安裝和與對(duì)象實(shí)現(xiàn)的激活及執(zhí)行有關(guān)的策略控制都是通過實(shí)現(xiàn)倉庫上的操作完成的客戶樁和實(shí)現(xiàn)骨架客戶樁又稱為IDLStubs,是由IDL編譯程序根據(jù)IDL文件生成的,與編程語言相關(guān)的客戶端代碼段,客戶樁向客戶提供一個(gè)因接口而異的API實(shí)現(xiàn)骨架又稱為IDLSkeleton,是由IDL編譯程序根據(jù)IDL文件生成的,與編程語言相關(guān)的服務(wù)器端代碼框架,實(shí)現(xiàn)骨架提供將對(duì)象適配器轉(zhuǎn)發(fā)的請(qǐng)求調(diào)度到對(duì)象實(shí)現(xiàn)上的代碼動(dòng)態(tài)激活接口DII和動(dòng)態(tài)骨架接口DSIDII(DynamicInvocationInterface)是一種允許動(dòng)態(tài)創(chuàng)建和激活對(duì)CORBA對(duì)象請(qǐng)求的客戶端接口,根據(jù)客戶代碼提供的要調(diào)用的對(duì)象、要執(zhí)行的操作、操作的參數(shù)集和參數(shù)類型等信息(其中包括從接口倉庫中獲得的各種動(dòng)態(tài)信息),在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建和激活對(duì)對(duì)象的請(qǐng)求DSI(DynamicSkeletonInterface)是一種允許將請(qǐng)求在運(yùn)行時(shí)從對(duì)象適配器動(dòng)態(tài)提交給對(duì)象實(shí)現(xiàn)的接口。DSI要求實(shí)現(xiàn)代碼必須向ORB提供所有操作參數(shù)的描述,ORB則提供輸入?yún)?shù)的值,以便在執(zhí)行操作時(shí)使用,在執(zhí)行操作后,實(shí)現(xiàn)代碼向ORB提供輸出參數(shù)的值或者異常CORBA請(qǐng)求發(fā)送和響應(yīng)的方法客戶機(jī)與遠(yuǎn)程對(duì)象發(fā)送和接受請(qǐng)求的方法主要有兩種:靜態(tài)方法和動(dòng)態(tài)方法,靜態(tài)方法更為普遍靜態(tài)方法要求在編譯時(shí)已知所有的IDL接口,由IDL編譯程序生成客戶端的樁代碼和服務(wù)器端的骨架代碼,并分別鏈接到客戶機(jī)程序和對(duì)象實(shí)現(xiàn)中對(duì)于動(dòng)態(tài)方法,在編譯時(shí)客戶機(jī)和服務(wù)器端程序都不知道IDL接口。運(yùn)行時(shí),客戶端使用DII(動(dòng)態(tài)激活接口)向?qū)ο髮?shí)現(xiàn)發(fā)出請(qǐng)求,服務(wù)器端對(duì)象適配器使用DSI(動(dòng)態(tài)骨架接口)訪問對(duì)象實(shí)現(xiàn),兩者之間的接口信息從ORB接口倉庫中動(dòng)態(tài)獲取ORB通信協(xié)議模型ClientStubORBClientServer-objectServer-objectServerSkeletonServerSkeletonORB(Java)ORB(C++)IIOPIIOPCORBA構(gòu)件模型構(gòu)件模型的產(chǎn)生CORBA3.0首次提出了構(gòu)件模型,擴(kuò)充了CORBA的對(duì)象模型CORBA構(gòu)件模型(CORBAComponentModel:CCM)是一種用來構(gòu)建和部署CORBA應(yīng)用程序的服務(wù)器端構(gòu)件模型,其設(shè)計(jì)思想比較類似于EJB,大量的代碼生成以及系統(tǒng)功能的實(shí)現(xiàn)由容器提供者而不是應(yīng)用程序自己來完成CCM的體系結(jié)構(gòu)主要包含:抽象構(gòu)件模型,構(gòu)件實(shí)現(xiàn)框架(ComponentImplementationFramework:CIF),構(gòu)件的包裝、組織和部署,構(gòu)件容器框架等抽象構(gòu)件模型(1)CCM抽象構(gòu)件模型定義了服務(wù)器端構(gòu)件及其交互構(gòu)件插座(uses)事件接收器(consumes)事件源(publishes,emits)構(gòu)件接口(supports)呈面(provides)屬性(1)構(gòu)件接口唯一標(biāo)識(shí)了構(gòu)件的實(shí)例,客戶可通過對(duì)構(gòu)件接口的引用來調(diào)用構(gòu)件的操作,支持一個(gè)或多個(gè)接口例:
interfaceA,B;//ForwarddeclarationcomponentFoosupportsA,B//definitionofequivalentinterface{//anditssupportedinterfacesprovidesW,X,Y,Z;//Facets(providedinterfaces.)…//othercomponentdefinitions};抽象構(gòu)件模型(2)(2)呈面標(biāo)識(shí)構(gòu)件向客戶提供的可訪問的功能接口,上例中,呈面W,X,Y,Z標(biāo)識(shí)構(gòu)件提供的W,X,Y,Z接口(3)插座(receptacles)是構(gòu)件之間連接(connection)的描述模型。IDL中的關(guān)鍵字“uses”用于定義構(gòu)件與要連接的接口之間的關(guān)系,如:
Checkout{…};componentShoppingCart{usesCheckoutthe_checkout;}抽象構(gòu)件模型(3)(4)事件接收器(eventsink)和事件源(eventsource)CCM支持發(fā)布/訂閱事件模型,屬于推(push)模型,事件使用者(consumer,或稱為事件接收器)先訂閱(subscribe)某類事件,此后,事件產(chǎn)生者(supplier,或稱為事件源)把事件推給使用者作為事件源的構(gòu)件產(chǎn)生事件的方式有兩種:(1)發(fā)布(publishes)方式:在產(chǎn)生事件的構(gòu)件與任一接收者之間建立專門通道(2)廣播(emits)方式:利用多個(gè)產(chǎn)生者共享的通道廣播事件構(gòu)件也可能接收別的構(gòu)件產(chǎn)生的事件,用關(guān)鍵字”consumes”說明抽象構(gòu)件模型(4)(5)屬性主要用于構(gòu)件部署(6)構(gòu)件實(shí)例是由Home來管理,一個(gè)Home管理某一類構(gòu)件的所有實(shí)例.Home要求所有的實(shí)例在一處生成,從而有效管理其生命周期,這是工廠設(shè)計(jì)模式的典型應(yīng)用抽象構(gòu)件模型(5)構(gòu)件的容器框架容器提供服務(wù)方的運(yùn)行環(huán)境,CORBA構(gòu)件使用一個(gè)容器來實(shí)現(xiàn)對(duì)系統(tǒng)服務(wù)的訪問CORBA構(gòu)件內(nèi)部接口POA回調(diào)接口容器外部接口構(gòu)件HomeCORBA構(gòu)件內(nèi)部接口POA回調(diào)接口容器外部接口構(gòu)件HomeORB事務(wù)安全持久狀態(tài)通知CORBA構(gòu)件接口為了使客戶能夠準(zhǔn)確、方便地訪問服務(wù),服務(wù)的提供者必須對(duì)自身進(jìn)行準(zhǔn)確的描述,并以一定的方式提供給客戶
接口的定義是必須的接口的必要性接口模塊(Module)通常由接口(Interface)和實(shí)現(xiàn)(Implementation)兩部分組成模塊接口刻畫了各個(gè)模塊是如何耦合的模塊的實(shí)現(xiàn)部分是各個(gè)模塊的內(nèi)部事務(wù)模塊是什么?其它模塊的設(shè)計(jì)者和使用者需要知道其它模塊的設(shè)計(jì)者和使用者不需要知道功能性描述是對(duì)接口中各個(gè)操作調(diào)用方式的描述,分為對(duì)輸入和輸出兩個(gè)部分的描述約束性描述是對(duì)功能以外特征的描述,不僅包括異常處理、執(zhí)行語義等簡(jiǎn)單內(nèi)容,還包括行為特征和同步特征接口包含的具體內(nèi)容以描述結(jié)構(gòu)化程序的功能為主(如RPC-IDL,微軟的-IDL)以描述對(duì)象的功能為主(如CORBA的IDL)以描述服務(wù)為主(如webservice的WSDL服務(wù)描述語言)幾種接口定義語言為什么需要IDL?IDLSmalltalkCobolJavaAda-95C++CIDL可轉(zhuǎn)換為多種編程語言,用其它語言實(shí)現(xiàn)OMGIDL編譯器IDLidl2javaIdl2c++ClientstubServerskeletonClientstubServerskeletonIDL編譯器的工作流程IDL編譯器CORBA庫CORBA庫本地代理
目標(biāo)對(duì)象存根代碼XXXC.X框架代碼XXXS.X客戶程序服務(wù)器程序客戶程序像訪問本地對(duì)象一樣訪問遠(yuǎn)程對(duì)象保存接口把對(duì)象接口映射成某種語言IDL的任何基本類型映射到特定語言中時(shí)保持其size不變,但可能改變其標(biāo)識(shí)范圍(Range)IDL自定義類型包括對(duì)特殊類型的重命名和復(fù)雜類型的定義,復(fù)雜類型包括EnumerationStructureUnionSequencearrayIDL的數(shù)據(jù)類型類似于C++中枚舉類型的定義方式:enumColor{red,green,blue,black,orange};IDL不定義枚舉類型中各個(gè)成員的特定序號(hào),只定義一種對(duì)比關(guān)系(序號(hào)由左向右增加)與C++不同,IDL不允許控制枚舉成員的序號(hào),比如:
enumColor{red=0,green=7};//不合法定義枚舉類型表示一個(gè)閉包的命名空間,任何枚舉成員不能重復(fù)出現(xiàn)在多個(gè)枚舉類型中
enumInteriorColor{white,blue,grey};
enumExteriorColor{yellow,blue,green};//不合法不允許定義空的枚舉類型IDL數(shù)據(jù)類型-Enumeration結(jié)構(gòu)中通常包含一個(gè)或多個(gè)任意類型的成員,包括用戶自定義的復(fù)雜類型
structTimeofDay{shorthour;shortminute;shortsecond;};結(jié)構(gòu)允許嵌套定義
structOuter{structFirstNested{longfirst;longsecond;}firstS;structSecondNested{longfirst;longsecond;}secondS;};IDL數(shù)據(jù)類型-StructureIDL聯(lián)合類型完全不同于C++中的聯(lián)合
unionColorCountswitch(Color){casered:casegreen:caseblue:unsignedlongnum_in_stock;caseblack:floatdiscount;default:stringorder_details;};聯(lián)合中的成員類型可以是任意類型,包括用戶定義的復(fù)雜類型,而鑒別器類型必須是整型(char,short,long,boolean,enum)IDL數(shù)據(jù)類型-Uniondefault在聯(lián)合類型中是一個(gè)可選項(xiàng),不過,只要它存在于聯(lián)合類型中,就必須要代替一種特定的情況(其它情況均不成立),該情況不能為空,否則是不合法的
unionUswitch(boolean){caseFALSE:longcount;caseTRUE:stringmessage;default://Illegal,defaultcasecannothappenfloatcost;};IDL數(shù)據(jù)類型-UnionIDL支持一維和多維數(shù)組
typedefColorColorVector[10];typedefstringIDtable[10][20];數(shù)組必須用typedef關(guān)鍵字定義,每一維元素個(gè)數(shù)必須明確定義
typedefstringIDtable[][20];//
ErrorIDL數(shù)據(jù)類型-Array序列是IDL特有的特殊數(shù)據(jù)類型,其本質(zhì)是變長(zhǎng)數(shù)組,可包含任意類型元素,可以是有界的或無界的
typedefsequence<Color>Colors;typedefsequence<long,100>Numbers;序列是可空的IDL數(shù)據(jù)類型-Sequencetypedef
unsignedlongPhoneNumber;typedef
stringGuestName,Address;enumChargeCard
{MasterCard,Visa,AmericanExpress};
structGuestRecord{
GuestName
name;
Address
address;
PhoneNumber
number;
ChargeCard
card_kind;
unsignedlongcard_number,expiration;};typedef
sequence<GuestRecord>GuestList;IDL類型定義示例typedef
structEmployeestruct{
stringname;
Addressaddress;
unsigned
longsocial_security_number;}Employee;typedef
EmployeeRecord
Employee[100];enumPersonKind
{A_GUEST,AN_EMPLOYEE,AN_OTHER};unionPersonswitch(PersonKind){ caseA_GUEST:
GuestRecord
guest_record; caseAN_EMPLOYEE
EmployeeRecord
employee_record; default:stringdescription;};IDL類型定義示例(續(xù))接口通過interface關(guān)鍵字來定義
interface
Calculator{shortadd(inshorts1,inshorts2);shortsub(inshorts1,inshorts2);shortmul(inshorts1,inshorts2);shortdiv(inshorts1,inshorts2);};IDL接口定義了分布對(duì)象對(duì)外表現(xiàn)的細(xì)節(jié),每個(gè)IDL接口定義了一個(gè)新對(duì)象類型對(duì)接口的訪問通過調(diào)用接口內(nèi)定義的操作來實(shí)現(xiàn),操作是接口的核心,是服務(wù)請(qǐng)求的入口點(diǎn)接口清晰地劃分了服務(wù)實(shí)現(xiàn)與客戶之間的邊界IDL接口(Interface)接口中定義的所有內(nèi)容都具有public屬性IDL接口中不包含成員變量,客戶端所有的請(qǐng)求均通過調(diào)用接口中的相關(guān)操作來實(shí)現(xiàn)每個(gè)CORBA對(duì)象只對(duì)應(yīng)一個(gè)接口,而每個(gè)接口則對(duì)應(yīng)于若干CORBA對(duì)象換句話說:IDL接口對(duì)應(yīng)于C++類的定義,而CORBA對(duì)象則對(duì)應(yīng)于C++類的實(shí)例IDL接口(Interface)IDL接口組成一個(gè)名字空間接口中可以嵌套其它的定義,如Constantdefinition常量定義Typedefinition類型定義Exceptiondefinition異常定義Attributedefinition屬性定義Operationdefinition操作定義接口不支持嵌套定義接口的語法interfaceHaystack
{
exception
NotFound
{
unsignedlongnum_straws_searched;
};
//異常定義
constunsignedlongMAX_LENGTH
=10;
//常量定義
readonlyattributeunsignedlongnum_straws;
//屬性定義
typedeflong
Needle;
//類型定義
typedefstring
Straw;
voidadd(inStraw
s);
//操作定義
booleanremove(inStraw
s);
voidfind(inNeedle
n)raises(NotFound);};接口的語法操作定義必須包括:返回值類型(非匿名類型);操作名字(不可重載);零個(gè)或多個(gè)參數(shù)聲明。操作不區(qū)分讀寫操作例如:interfacesimple{voidop();//注意:voidop(void)是錯(cuò)誤的
//同樣:op();也是錯(cuò)誤的
};接口例子:interfacePrimes{typedefunsignedlongprime;primenext_prime(inlongn);voidnext_prime2(inlongn,outprimep);voidnext_prime3(inoutlongn);};其中in表示從Client->Server;out表示從Server->ClientIDL操作操作簽名(Signature)的一般形式為:
[oneway]<op_type_spec><identifier>(param1,...,paramL)[raises(except1,...,exceptN)][context(name1,...,nameM)]其中:Oneway表示該操作為異步操作,操作機(jī)制類似于UDP數(shù)據(jù)報(bào)通信,是一種不可靠的信息傳輸機(jī)制:返回類型必須為void;不包含out參數(shù)或inout參數(shù);不包含raise表達(dá)式
<op_type_spec>是返回結(jié)果的類型<identifier>為接口中的操作提供名稱raises指示可能引發(fā)的異常處理context指示有效的請(qǐng)求環(huán)境信息IDL操作(續(xù))CORBA保證發(fā)出請(qǐng)求的客戶總是可以接收到一個(gè)成功的返回或者一個(gè)異常異常被分為兩類:用戶自定義異常和系統(tǒng)異常,IDL定義了29個(gè)系統(tǒng)異常,具有不同的名字,但共用同一個(gè)異常體異常的聲明類似于IDL結(jié)構(gòu)類型exceptionCardExpired{stringexpiration_date;};exceptionCreditLimitExceeded {unsignedlongcredit_limit;};exceptionCardReportedStolen{
string
reporting_instructions;
unsignedlonghotline_phone_number;};IDL異常(Exceptions)IDL接口可定義公共屬性,屬性可以是只讀的(Read-only)或者可讀寫的(read-write),屬性定義不包含raise表達(dá)式只讀屬性代表一個(gè)基本操作,可進(jìn)行讀操作可讀寫屬性代表一對(duì)基本操作,可進(jìn)行讀寫操作IDL屬性interfaceThermostat{readonlyattributeshort
temperature;attributeshort
nominal_temp;};在語義上等價(jià)于:interfaceThermostat{
shortget_temperature();
shortget_nominal_temp();
voidset_nominal_temp(inshort
t);};模塊是為IDL定義、創(chuàng)建、分離名字的空間,防止不同模塊中標(biāo)識(shí)之間的沖突模塊可以嵌套;CORBAServices對(duì)模塊進(jìn)行了擴(kuò)充,每個(gè)服務(wù)定義一個(gè)或多個(gè)模塊模塊內(nèi)的名字可通過如下方式引用:Part::Assembly::ComponentWidgetIDL模塊(Modules)module
Part{
typedef
Assembly::WidgetPartWidget;
module
ComponentPart{typedef
PartWidgetComponentWidget;};};IDL模塊定義的主要內(nèi)容常量類型異常接口模塊常量類型異常操作屬性CORBA應(yīng)用開發(fā)典型的CORBA應(yīng)用開發(fā)過程IDLIDLCompileIDLCompile客戶機(jī)服務(wù)器ORB庫客戶機(jī)樁ORB庫服務(wù)器骨架客戶機(jī)程序開發(fā)者服務(wù)器程序開發(fā)者使用靜態(tài)調(diào)用的CORBA應(yīng)用開發(fā)過程IDLFileidl2javaidl2cppidl2java客戶樁骨架JavaCompileJavaCompileC++Compile客戶程序?qū)ο髮?shí)現(xiàn)ClientProgramObjectImplementORB內(nèi)核StubSkeleton客戶端和服務(wù)器端使用同一開發(fā)環(huán)境客戶端和服務(wù)器端使用不同開發(fā)環(huán)境IONA公司的Orbix:Orbix是全球范圍內(nèi)部署最廣泛的企業(yè)CORBA解決方案(企業(yè)版/標(biāo)準(zhǔn)版/大型主機(jī)版),為全球規(guī)模最大要求最高的面向服務(wù)的體系結(jié)構(gòu)(SOA)
提供了基礎(chǔ)結(jié)構(gòu)Inprise公司的visibroker:提供visibrokerforjava,visibrokerfordephi,visibrokerforc++三個(gè)版本,主要實(shí)現(xiàn)了CORBA中的ORB核心技術(shù),同時(shí)又為CORBA提供了一些擴(kuò)充功能Digital公司的ObjectBroker:.NET平臺(tái)一款開源O/R映射框架IBM公司的ComponentBrokerOOC公司的OminiBrokerORB產(chǎn)品一個(gè)簡(jiǎn)單的CORBA應(yīng)用開發(fā)(自學(xué))例:網(wǎng)格對(duì)象調(diào)用,客戶遠(yuǎn)程調(diào)用服務(wù)器網(wǎng)格對(duì)象GridObject的get()和set()操作,開發(fā)環(huán)境為C++編程語言網(wǎng)格對(duì)象客戶機(jī)服務(wù)器widthheightget(row,col)set(row,col,value用IDL定義接口//grid.idlinterface
Grid{
readonlyattributeshortheight;readonlyattributeshortwidth;
void
set(in
shortrow,in
shortcol,in
longvalue);
void
get(in
shortrow,in
shortcol,out
shortvalue);};編譯IDL文件grid.idl客戶機(jī)服務(wù)器Grid.idlgridC.cc客戶機(jī)樁ORB客戶機(jī)庫gridS.cc服務(wù)器骨架ORB服務(wù)器庫Grid.hh公用的說明//grid.hhclassGrid:publicvirtualCORBA::Object{public:staticGrid_ptr_bind(…);virtualCORBA::Shortheight(CORBA::Environment&);virtualCORBA::Shortwidth(CORBA::Environment&);virtualvoidset(CORBA::Shortrow,CORBA::Shortcol,
CORBA::Longvalue,CORBA::Environment&);
virtualvoidget(CORBA::Shortrow,CORBA::Shortcol,CORBA::Environment&);};編譯grid.idl生成的文件//用C++語言定義對(duì)象實(shí)現(xiàn)Grid_i#include“grid.hh”classGrid_i:publicvirtualGridBOAImpl{
shortm_height,m_width;
long**m_array;public:
Grid_i(shorth,shortw);virtual~Grid_i();virtualCORBA::shortheight(CORBA::Environment&);
virtualCORBA::shortwidth(CORBA::Environment&);接口實(shí)現(xiàn)virtualvoid
set(CORBA::Shortrow,CORBA::Shortcol,
CORBA::Longvalue,CORBA::Environment&);
virtual::Longget(CORBA::Shortrow,CORBA::Shortcol,
CORBA::Environment&);};virtualCORBA::shortGrid_i::width(CORBA::Environment&){returnm_width;}virtualCORBA::shortGrid_i::height(CORBA::Environment&){returnm_height;}virtualvoid
Grid_i::set(CORBA::Shortrow,CORBA::Shortcol,CORBA::Longvalue,CORBA::Environment&){m_array[row][col]=value;}
virtual::LongGrid_i::
get(CORBA::Shortrow,
CORBA::Shortcol,CORBA::Environment&){returnm_array[row][col];}接口實(shí)現(xiàn)(續(xù))#include“grid.hh”#include<iostream.h>main(){Grid_imyGrid(100,100);try{CORBA::Orbix.impl_is_ready();}catch(…)cout<<“Serverterminating”<<endl;};編寫服務(wù)器端程序#include“grid.hh”#include<iostream.h>main(){Grid_varp;//類似于C++指針,連接到Grid對(duì)象
p=Grid::_bind(“myGrid:GridSrv”,GridHost);cout<<“heightis”<<p->height()<<endl;
cout<<“widthis”<<p->width()<<endl;
p->set(2,4,123);cout<<“grid[2,4]is“<<p->get(2,4)<<endl;};編寫客戶端程序銀行系統(tǒng)的一個(gè)簡(jiǎn)單實(shí)例,包含查詢和建戶操作描述實(shí)例2-定義IDL文件//Bank.idlmoduleBank{interfaceAccount{floatbalance(instringname);//返回帳戶存款余額操作voiddeposit(instringname,infloatamount);//存款voidwithdraw(instringname,infloatamount);//取款
};interfaceAccountManager{Accountopen(instringname,infloatinitvalue);//創(chuàng)建帳戶操作voiddelete(instringname);//刪除帳戶booleanfind(instringname);//查找?guī)?/p>
};};通過JDK提供的IDLJava編譯器idlj
生成如下文件Java接口定義文件客戶端樁代碼服務(wù)器端骨架代碼:對(duì)象實(shí)現(xiàn)的基類接口助手類文件:*Helper.java接口支持類文件:*Holder.java實(shí)例2-編譯后自動(dòng)生成的文件publicclassAccountImplextendsBank._AccountImplBase{privatefloatvalue;privateStringname;publicAccountImpl(Stringname,floatvalue){this.value=value;=name;}publicfloatbalance(Stringname){returnvalue;}publicvoiddeposit(Stringname,floatamount){ }publicvoidwithdraw(Stringname,floatamount){ }}實(shí)例2(組件實(shí)現(xiàn)部分AccountImpl.java)publicclassAccountManagerImplextendsBank._AccountManagerImplBase{privateDictionary_accounts=newHashtable();privateRandom_random=newRandom();publicAccountManagerImpl(Stringname){ super();}p
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年四年級(jí)英語下冊(cè) Module 3 Unit 2 On Monday I'll go swimming教學(xué)實(shí)錄 外研版(三起)
- 2023一年級(jí)語文上冊(cè) 第一單元 4 日月水火配套教學(xué)實(shí)錄 新人教版
- 2024年學(xué)年七年級(jí)語文上冊(cè) 第一單元 學(xué)習(xí)經(jīng)歷 第1課《我的讀書經(jīng)歷》教學(xué)實(shí)錄3 新疆教育版
- 第一單元習(xí)作我的心愛之物教學(xué)設(shè)計(jì)2課時(shí)統(tǒng)編五年級(jí)上冊(cè)新課標(biāo)核心素養(yǎng)目標(biāo)
- 1000以內(nèi)數(shù)的組成和讀寫(教學(xué)設(shè)計(jì))-2023-2024學(xué)年二年級(jí)下冊(cè)數(shù)學(xué)人教版
- 2016年秋九年級(jí)化學(xué)上冊(cè) 第1單元 課題2 化學(xué)是一門以實(shí)驗(yàn)為基礎(chǔ)的科學(xué)教學(xué)實(shí)錄 (新版)新人教版
- 3《主動(dòng)拒絕煙酒與毒品》第一課時(shí)(教學(xué)設(shè)計(jì))2024-2025學(xué)年統(tǒng)編版道德與法治五年級(jí)上冊(cè)
- 2024年五年級(jí)英語上冊(cè) Unit 2 My Country and English-speaking Countries Lesson 12 Maddy's Family Photos教學(xué)實(shí)錄 冀教版(三起)
- 山地中式高層住宅設(shè)計(jì)方案
- 2023一年級(jí)數(shù)學(xué)上冊(cè) 六 20以內(nèi)的退位減法 1 11減幾教學(xué)實(shí)錄 西師大版
- 商業(yè)廣告設(shè)計(jì)課件
- 教會(huì)行政管理學(xué)課程教案
- SJG 44-2018 深圳市公共建筑節(jié)能設(shè)計(jì)規(guī)范-高清現(xiàn)行
- 2022年高考(全國甲卷)語文仿真模擬卷【含答案】
- 瀘州老窖股權(quán)激勵(lì)方案案例分析
- 火電廠廠用電系統(tǒng)與廠用電接線運(yùn)行特點(diǎn)分析
- 部編版小學(xué)語文三年級(jí)(下冊(cè))學(xué)期課程綱要
- _重大事故后果分析(精)
- 水泥攪拌樁施工監(jiān)理質(zhì)量控制要點(diǎn)
- 初級(jí)診斷師培訓(xùn)課程QC基礎(chǔ)知識(shí)
- 第7章 吸附課件
評(píng)論
0/150
提交評(píng)論