第06講:Corba模型及構(gòu)件接口語言_第1頁
第06講:Corba模型及構(gòu)件接口語言_第2頁
第06講:Corba模型及構(gòu)件接口語言_第3頁
第06講:Corba模型及構(gòu)件接口語言_第4頁
第06講:Corba模型及構(gòu)件接口語言_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

哈爾濱工業(yè)大學(xué)計算機(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)用請求進(jìn)行加工、打包 向底層通信機(jī)制(如套接字)發(fā)出請求消息

客戶代理 不進(jìn)行任何邏輯處理 只是一個中介3、客戶端通過底層的通信機(jī)制 將消息傳送給服務(wù)器端的底層通信機(jī)制RPC過程描述4、服務(wù)器需要部分地解析消息 找出客戶希望調(diào)用的服務(wù)器程序5、服務(wù)器代理對消息進(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)上也可能有多個調(diào)出點(diǎn) 通信機(jī)制需要部分地解析返回的消息 找出消息應(yīng)該返回給哪個客戶程序 并將消息發(fā)送給對應(yīng)的客戶代理11、客戶代理從消息中解析結(jié)果 返回給客戶程序客戶端開發(fā)過程服務(wù)器端開發(fā)過程服務(wù)器端程序IDL編譯器(rpcgen)客戶端程序IDLaccount.haccount_clnt.caccount_svc.cserver.cclient.crpclib.o互操作接口定義語言互操作協(xié)議

互操作實現(xiàn)(以RPC為例)互操作查找互操作規(guī)范底層協(xié)議決定決定服務(wù)器端程序客戶端程序客戶端代理互操作消息網(wǎng)絡(luò)基礎(chǔ)設(shè)施服務(wù)器端代理互操作消息網(wǎng)絡(luò)基礎(chǔ)設(shè)施CORBA的概念與組成CORBA概述CORBA(CommonObjectRequestBrokerArchitecture公共對象請求代理體系結(jié)構(gòu))是OMG制定的、最清晰的、跨越平臺最多的分布對象模型通過IDL(InterfaceDefinitionLanguage)定義的接口,使用不同的編程語言,不同編譯器實現(xiàn)的構(gòu)件,可以通過對象請求代理(ORB:ObjectRequestBroker)連接,形成跨平臺的應(yīng)用CORBA是一套規(guī)約,而不是一個產(chǎn)品,開發(fā)商可以開發(fā)不同的產(chǎn)品來實現(xiàn)CORBA規(guī)約CORBA歷史OMG成立于1989年,CORBA規(guī)約的第一代主要集中在為分布式對象定義了一個基礎(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增加了移植性的對象適配器(POA:PortableObjectAdapter)和IDL到Java語言的映射規(guī)約,OMA中增加了領(lǐng)域接口部分2001年頒布的CORBA3.0增加了CCM(CORBAComponentModel:CORBA構(gòu)件模型),提供容器作為構(gòu)件的運(yùn)行環(huán)境CORBA的組成客戶程序Client對象實現(xiàn)Server動態(tài)調(diào)用客戶IDL存根ORB接口動態(tài)框架接口靜態(tài)框架接口對象適配器對象請求中間件核心(ORBCore)接口倉庫實現(xiàn)庫CORBA的基準(zhǔn)模型對象請求代理(ORB)對象服務(wù)應(yīng)用對象公共設(shè)施基準(zhǔn)模型描述了分布式對象系統(tǒng)的基本成分(1)CORBAService(對象服務(wù))是一組系統(tǒng)級對象,為實現(xiàn)和管理對象提供了基本功能,包括名字、生存周期服務(wù)、事務(wù)服務(wù)、安全服務(wù)等(2)ORB是核心,它提供了一種機(jī)制,使得對象可以透明的發(fā)送請求和接受響應(yīng)ORB與對象服務(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)用對象)是專用于特定領(lǐng)域的構(gòu)件CORBA的基準(zhǔn)模型(續(xù))對象類的上下文關(guān)系ORB的體系結(jié)構(gòu)接口倉庫IDL編譯程序?qū)崿F(xiàn)倉庫客戶機(jī)對象實現(xiàn)GIOP/IIOPDII客戶代理ORB內(nèi)核ORB接口Operation()輸入?yún)?shù)輸出參數(shù)+返回值對象適配器實現(xiàn)骨架DSIORB體系結(jié)構(gòu)定義一個描述客戶機(jī)如何向遠(yuǎn)程對象發(fā)送請求并得到回答的框架ORB的職責(zé)ORB給分布式對象提供了透明發(fā)送請求和接受響應(yīng)的機(jī)制,主要包括以下職責(zé):負(fù)責(zé)根據(jù)客戶機(jī)給出的對象引用定位相應(yīng)的遠(yuǎn)程對象實現(xiàn),激活遠(yuǎn)程對象實現(xiàn),建立與遠(yuǎn)程對象實現(xiàn)的連接客戶端ORB接受客戶機(jī)請求的參數(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ā)送給對象實現(xiàn)負(fù)責(zé)將對象實現(xiàn)響應(yīng)客戶機(jī)的請求后的輸出參數(shù)、返回值等,以同樣的打包/解包方式,傳回給客戶機(jī)ORB內(nèi)核和ORB接口ORB內(nèi)核提供了對象的通用表示和對象間通信的機(jī)制??蛻艉蛯ο髮崿F(xiàn)通過ORB接口的形式訪問ORB內(nèi)核提供的功能ORB接口是客戶與對象實現(xiàn)可以直接訪問到的、抽象描述ORB操作的接口,ORB接口由ORB內(nèi)核實現(xiàn),它不倚賴于任何的對象適配器,ORB接口主要包括:ORB初始化(ORB-init)獲取初始對象引用對象引用操作策略域的管理線程有關(guān)的操作ORB的實現(xiàn)方式

位于客戶和對象實現(xiàn)內(nèi)部的ORB

基于服務(wù)器的ORB基于系統(tǒng)的ORBORB的對象適配器OAOA是對象實現(xiàn)訪問ORB所提供服務(wù)的主要方式,由于對象實現(xiàn)方式不同,ORB內(nèi)核很難為所有對象提供方便有效的單一接口,通過OA,ORB可以定制接口,為一組特定的對象實現(xiàn)提供服務(wù),OA負(fù)責(zé)的主要功能有:生成和解釋對象引用,方法調(diào)用、注冊、激活和凍結(jié)對象實現(xiàn),將對象引用映射到相應(yīng)的對象實現(xiàn)BOA(基本對象適配器)著重CORBA服務(wù)器實現(xiàn)POA(可移植對象適配器)規(guī)約將CORBA對象定義為具有標(biāo)識、接口和實現(xiàn)的抽象實體,負(fù)責(zé)把CORBA對象概念適配為編程語言的服務(wù)體(Servant)概念,允許編程人員構(gòu)造可移植的對象實現(xiàn)對象適配器ORB通過對象適配器提供的服務(wù)通常包括生成和解釋對象引用方法調(diào)用交互的安全性對象和實現(xiàn)的激活及凍結(jié)將對象引用映射到實現(xiàn)注冊實現(xiàn)對象粒度、壽命、策略、實現(xiàn)風(fēng)格等的明顯區(qū)別使得

ORB核心很難為所有對象提供方便和有效的單一接口通過對象適配器

ORB可以將一組特定的對象實現(xiàn)作為目標(biāo)對象適配器的作用ORB的接口倉庫和實現(xiàn)倉庫接口倉庫(InterfaceRepository:IR)是儲存、發(fā)布、管理相關(guān)對象接口定義的集合,通常以IDL文件作為輸入,將接口描述信息經(jīng)過處理后存放在文件、數(shù)據(jù)庫或者其它形式的存儲機(jī)制中,并提供一組標(biāo)準(zhǔn)的調(diào)用接口供運(yùn)行時動態(tài)查詢實現(xiàn)倉庫包含了允許ORB激活和定位對象實現(xiàn)的信息,一般來說,對象實現(xiàn)的安裝和與對象實現(xiàn)的激活及執(zhí)行有關(guān)的策略控制都是通過實現(xiàn)倉庫上的操作完成的客戶樁和實現(xiàn)骨架客戶樁又稱為IDLStubs,是由IDL編譯程序根據(jù)IDL文件生成的,與編程語言相關(guān)的客戶端代碼段,客戶樁向客戶提供一個因接口而異的API實現(xiàn)骨架又稱為IDLSkeleton,是由IDL編譯程序根據(jù)IDL文件生成的,與編程語言相關(guān)的服務(wù)器端代碼框架,實現(xiàn)骨架提供將對象適配器轉(zhuǎn)發(fā)的請求調(diào)度到對象實現(xiàn)上的代碼動態(tài)激活接口DII和動態(tài)骨架接口DSIDII(DynamicInvocationInterface)是一種允許動態(tài)創(chuàng)建和激活對CORBA對象請求的客戶端接口,根據(jù)客戶代碼提供的要調(diào)用的對象、要執(zhí)行的操作、操作的參數(shù)集和參數(shù)類型等信息(其中包括從接口倉庫中獲得的各種動態(tài)信息),在運(yùn)行時動態(tài)創(chuàng)建和激活對對象的請求DSI(DynamicSkeletonInterface)是一種允許將請求在運(yùn)行時從對象適配器動態(tài)提交給對象實現(xiàn)的接口。DSI要求實現(xiàn)代碼必須向ORB提供所有操作參數(shù)的描述,ORB則提供輸入?yún)?shù)的值,以便在執(zhí)行操作時使用,在執(zhí)行操作后,實現(xiàn)代碼向ORB提供輸出參數(shù)的值或者異常CORBA請求發(fā)送和響應(yīng)的方法客戶機(jī)與遠(yuǎn)程對象發(fā)送和接受請求的方法主要有兩種:靜態(tài)方法和動態(tài)方法,靜態(tài)方法更為普遍靜態(tài)方法要求在編譯時已知所有的IDL接口,由IDL編譯程序生成客戶端的樁代碼和服務(wù)器端的骨架代碼,并分別鏈接到客戶機(jī)程序和對象實現(xiàn)中對于動態(tài)方法,在編譯時客戶機(jī)和服務(wù)器端程序都不知道IDL接口。運(yùn)行時,客戶端使用DII(動態(tài)激活接口)向?qū)ο髮崿F(xiàn)發(fā)出請求,服務(wù)器端對象適配器使用DSI(動態(tài)骨架接口)訪問對象實現(xiàn),兩者之間的接口信息從ORB接口倉庫中動態(tài)獲取ORB通信協(xié)議模型ClientStubORBClientServer-objectServer-objectServerSkeletonServerSkeletonORB(Java)ORB(C++)IIOPIIOPCORBA構(gòu)件模型構(gòu)件模型的產(chǎn)生CORBA3.0首次提出了構(gòu)件模型,擴(kuò)充了CORBA的對象模型CORBA構(gòu)件模型(CORBAComponentModel:CCM)是一種用來構(gòu)建和部署CORBA應(yīng)用程序的服務(wù)器端構(gòu)件模型,其設(shè)計思想比較類似于EJB,大量的代碼生成以及系統(tǒng)功能的實現(xiàn)由容器提供者而不是應(yīng)用程序自己來完成CCM的體系結(jié)構(gòu)主要包含:抽象構(gòu)件模型,構(gòu)件實現(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)識了構(gòu)件的實例,客戶可通過對構(gòu)件接口的引用來調(diào)用構(gòu)件的操作,支持一個或多個接口例:

interfaceA,B;//ForwarddeclarationcomponentFoosupportsA,B//definitionofequivalentinterface{//anditssupportedinterfacesprovidesW,X,Y,Z;//Facets(providedinterfaces.)…//othercomponentdefinitions};抽象構(gòu)件模型(2)(2)呈面標(biāo)識構(gòu)件向客戶提供的可訪問的功能接口,上例中,呈面W,X,Y,Z標(biāo)識構(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)方式:利用多個產(chǎn)生者共享的通道廣播事件構(gòu)件也可能接收別的構(gòu)件產(chǎn)生的事件,用關(guān)鍵字”consumes”說明抽象構(gòu)件模型(4)(5)屬性主要用于構(gòu)件部署(6)構(gòu)件實例是由Home來管理,一個Home管理某一類構(gòu)件的所有實例.Home要求所有的實例在一處生成,從而有效管理其生命周期,這是工廠設(shè)計模式的典型應(yīng)用抽象構(gòu)件模型(5)構(gòu)件的容器框架容器提供服務(wù)方的運(yùn)行環(huán)境,CORBA構(gòu)件使用一個容器來實現(xiàn)對系統(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ù)的提供者必須對自身進(jìn)行準(zhǔn)確的描述,并以一定的方式提供給客戶

接口的定義是必須的接口的必要性接口模塊(Module)通常由接口(Interface)和實現(xiàn)(Implementation)兩部分組成模塊接口刻畫了各個模塊是如何耦合的模塊的實現(xiàn)部分是各個模塊的內(nèi)部事務(wù)模塊是什么?其它模塊的設(shè)計者和使用者需要知道其它模塊的設(shè)計者和使用者不需要知道功能性描述是對接口中各個操作調(diào)用方式的描述,分為對輸入和輸出兩個部分的描述約束性描述是對功能以外特征的描述,不僅包括異常處理、執(zhí)行語義等簡單內(nèi)容,還包括行為特征和同步特征接口包含的具體內(nèi)容以描述結(jié)構(gòu)化程序的功能為主(如RPC-IDL,微軟的-IDL)以描述對象的功能為主(如CORBA的IDL)以描述服務(wù)為主(如webservice的WSDL服務(wù)描述語言)幾種接口定義語言為什么需要IDL?IDLSmalltalkCobolJavaAda-95C++CIDL可轉(zhuǎn)換為多種編程語言,用其它語言實現(xiàn)OMGIDL編譯器IDLidl2javaIdl2c++ClientstubServerskeletonClientstubServerskeletonIDL編譯器的工作流程IDL編譯器CORBA庫CORBA庫本地代理

目標(biāo)對象存根代碼XXXC.X框架代碼XXXS.X客戶程序服務(wù)器程序客戶程序像訪問本地對象一樣訪問遠(yuǎn)程對象保存接口把對象接口映射成某種語言IDL的任何基本類型映射到特定語言中時保持其size不變,但可能改變其標(biāo)識范圍(Range)IDL自定義類型包括對特殊類型的重命名和復(fù)雜類型的定義,復(fù)雜類型包括EnumerationStructureUnionSequencearrayIDL的數(shù)據(jù)類型類似于C++中枚舉類型的定義方式:enumColor{red,green,blue,black,orange};IDL不定義枚舉類型中各個成員的特定序號,只定義一種對比關(guān)系(序號由左向右增加)與C++不同,IDL不允許控制枚舉成員的序號,比如:

enumColor{red=0,green=7};//不合法定義枚舉類型表示一個閉包的命名空間,任何枚舉成員不能重復(fù)出現(xiàn)在多個枚舉類型中

enumInteriorColor{white,blue,grey};

enumExteriorColor{yellow,blue,green};//不合法不允許定義空的枚舉類型IDL數(shù)據(jù)類型-Enumeration結(jié)構(gòu)中通常包含一個或多個任意類型的成員,包括用戶自定義的復(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)合類型中是一個可選項,不過,只要它存在于聯(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)鍵字定義,每一維元素個數(shù)必須明確定義

typedefstringIDtable[][20];//

ErrorIDL數(shù)據(jù)類型-Array序列是IDL特有的特殊數(shù)據(jù)類型,其本質(zhì)是變長數(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接口定義了分布對象對外表現(xiàn)的細(xì)節(jié),每個IDL接口定義了一個新對象類型對接口的訪問通過調(diào)用接口內(nèi)定義的操作來實現(xiàn),操作是接口的核心,是服務(wù)請求的入口點(diǎn)接口清晰地劃分了服務(wù)實現(xiàn)與客戶之間的邊界IDL接口(Interface)接口中定義的所有內(nèi)容都具有public屬性IDL接口中不包含成員變量,客戶端所有的請求均通過調(diào)用接口中的相關(guān)操作來實現(xiàn)每個CORBA對象只對應(yīng)一個接口,而每個接口則對應(yīng)于若干CORBA對象換句話說:IDL接口對應(yīng)于C++類的定義,而CORBA對象則對應(yīng)于C++類的實例IDL接口(Interface)IDL接口組成一個名字空間接口中可以嵌套其它的定義,如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);};接口的語法操作定義必須包括:返回值類型(非匿名類型);操作名字(不可重載);零個或多個參數(shù)聲明。操作不區(qū)分讀寫操作例如:interfacesimple{voidop();//注意:voidop(void)是錯誤的

//同樣:op();也是錯誤的

};接口例子: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ù)報通信,是一種不可靠的信息傳輸機(jī)制:返回類型必須為void;不包含out參數(shù)或inout參數(shù);不包含raise表達(dá)式

<op_type_spec>是返回結(jié)果的類型<identifier>為接口中的操作提供名稱raises指示可能引發(fā)的異常處理context指示有效的請求環(huán)境信息IDL操作(續(xù))CORBA保證發(fā)出請求的客戶總是可以接收到一個成功的返回或者一個異常異常被分為兩類:用戶自定義異常和系統(tǒng)異常,IDL定義了29個系統(tǒng)異常,具有不同的名字,但共用同一個異常體異常的聲明類似于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á)式只讀屬性代表一個基本操作,可進(jìn)行讀操作可讀寫屬性代表一對基本操作,可進(jìn)行讀寫操作IDL屬性interfaceThermostat{readonlyattributeshort

temperature;attributeshort

nominal_temp;};在語義上等價于:interfaceThermostat{

shortget_temperature();

shortget_nominal_temp();

voidset_nominal_temp(inshort

t);};模塊是為IDL定義、創(chuàng)建、分離名字的空間,防止不同模塊中標(biāo)識之間的沖突模塊可以嵌套;CORBAServices對模塊進(jìn)行了擴(kuò)充,每個服務(wù)定義一個或多個模塊模塊內(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ū)ο髮崿F(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++三個版本,主要實現(xiàn)了CORBA中的ORB核心技術(shù),同時又為CORBA提供了一些擴(kuò)充功能Digital公司的ObjectBroker:.NET平臺一款開源O/R映射框架IBM公司的ComponentBrokerOOC公司的OminiBrokerORB產(chǎn)品一個簡單的CORBA應(yīng)用開發(fā)(自學(xué))例:網(wǎng)格對象調(diào)用,客戶遠(yuǎn)程調(diào)用服務(wù)器網(wǎng)格對象GridObject的get()和set()操作,開發(fā)環(huán)境為C++編程語言網(wǎng)格對象客戶機(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++語言定義對象實現(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&);接口實現(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];}接口實現(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對象

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)的一個簡單實例,包含查詢和建戶操作描述實例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ù)器端骨架代碼:對象實現(xiàn)的基類接口助手類文件:*Helper.java接口支持類文件:*Holder.java實例2-編譯后自動生成的文件publicclassAccountImplextendsBank._AccountImplBase{privatefloatvalue;privateStringname;publicAccountImpl(Stringname,floatvalue){this.value=value;=name;}publicfloatbalance(Stringname){returnvalue;}publicvoiddeposit(Stringname,floatamount){ }publicvoidwithdraw(Stringname,floatamount){ }}實例2(組件實現(xiàn)部分AccountImpl.java)publicclassAccountManagerImplextendsBank._AccountManagerImplBase{privateDictionary_accounts=newHashtable();privateRandom_random=newRandom();publicAccountManagerImpl(Stringname){ super();}p

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論