高級操作系統(tǒng) 第七章 分布式對象技術(shù)_第1頁
高級操作系統(tǒng) 第七章 分布式對象技術(shù)_第2頁
高級操作系統(tǒng) 第七章 分布式對象技術(shù)_第3頁
高級操作系統(tǒng) 第七章 分布式對象技術(shù)_第4頁
高級操作系統(tǒng) 第七章 分布式對象技術(shù)_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

CommonObjectRequestBrokerArchitecture公共對象請求代理結(jié)構(gòu)第七章分布式對象技術(shù)CORBA1.1對象管理組織OMG的CORBAOMG(ObjectManagementGroup)成立于1989年,OMG是個非營利性組織,不開發(fā)軟件,僅僅制定標準。目前有900多名成員:

OracleSunSoftIBMSybaseInformixHPDEC……2.1990年11月,OMG發(fā)表對象管理體系指南,初步闡明了CORBA思想。3.1991年10月,OMG推出CORBA1.0,定義了接口定義語言(IDL)、對象管理模型、動態(tài)請求API和接口倉庫等內(nèi)容。4.1991年12月,OMG推出CORBA1.1,引入對象適配器概念。5.1996年8月,OMG推出CORBA2.0,對象請求代理間協(xié)議

(IIOPInternetInter-ORBProtocol)完全基于面向?qū)ο蠹夹g(shù)6.現(xiàn)在,CORBA3.0更好支持EJB和JavaRMI

基于面向組件。各種技術(shù)發(fā)展歷程DNA:WindowsDistributedinterNetApplicationarchitectureOLE:ObjectLinkingandEmbedding,對象連接與嵌入

什么是CORBA?CORBA是由OMG組織制訂的一種標準的面向?qū)ο髴?yīng)用程序體系結(jié)構(gòu)(規(guī)范),為解決分布式處理環(huán)境(DCE)中,硬件和軟件系統(tǒng)的互連而提出的一種解決方案。DCE:DistributedComputingEnvironment

1.2CORBA用途CORBA是為實現(xiàn)軟件全方位集成而設(shè)計的。分布式軟件開發(fā)需解決以下五個問題:跨平臺(硬件)跨操作系統(tǒng)跨語言跨協(xié)議跨版本Internet使計算機聯(lián)結(jié)起來,CORBA使應(yīng)用軟件聯(lián)結(jié)起來。解決這五個問題的唯一方案,采用CORBA作為分布式軟件開發(fā)人員,CORBA使我們獲益如下:混合編程//我只會C++,不會Java豐富的編程元素//眾多基于CORBA的Toolkits高效的開發(fā)手段//軟件模塊重用十分便利,我不需要從零開始!版本無關(guān)性//CORBA版本向上向下兼容CORBA將在Internet上實現(xiàn)軟件的即插即用!1.3CORBA采用的技術(shù)CORBA采用了面向?qū)ο蠹夹g(shù)//從軟件重用角度考慮問題CORBA采用了分布式計算模型CORBA采用多層體系結(jié)構(gòu)CORBA采用接口技術(shù)//從軟件集成角度考慮問題1.4CORBA體系結(jié)構(gòu)應(yīng)用程序及各種對象CORBA工具集橫向:用戶界面、信息管理、系統(tǒng)及任務(wù)管理等工具集縱向:醫(yī)療保健、金融保險、電訊等面向行業(yè)的工具集CORBA對象請求代理---ORBCORBA服務(wù)對象生存期、對象關(guān)系、命名服務(wù)、對象查詢、事件服務(wù)對象屬性服務(wù)、對象安全、許可服務(wù)、事務(wù)服務(wù)等對象級別服務(wù)域接口是為應(yīng)用領(lǐng)域服務(wù)而提供的接口RFP(RequestForProposal)公共設(shè)施面向用戶的應(yīng)用對象管理體系結(jié)構(gòu)OMA1.4.1對象管理體系結(jié)構(gòu)OMA由OMG制定的規(guī)范——對象管理體系結(jié)構(gòu)(ObjectManagementArchitecture,OMA)和它的核心(也就是CORBA規(guī)范),提供了一個完整的體系結(jié)構(gòu)。OMA描述了面向?qū)ο蠹夹g(shù)在分布式處理中的運用。OMA包括兩部分:對象模型(ObjectModel)和參考模型(ReferenceModel)。對象模型:定義如何描述分布式異構(gòu)環(huán)境中的對象。參考模型:描述對象之間的交互。OMA對象模型在OMA對象模型中,對象是一個被封裝的實體,它具有一個不可改變的標識,并能給客戶用戶提供一個或多個服務(wù)。interfaceprinter{ attributelongmodel; voidprint(instringbuffer);};OMA參考模型在OMA參考模型中,OMG定義了一條為對象所公用的通信總線,即ORB。OMG還定義了對象進出這一總線的界面。包括:對象服務(wù)(ObjectServices)公共設(shè)施(CommonFacilities)應(yīng)用界面(ApplicationInterface)域界面(DomainInterface)1.4.2對象請求代理ORB聯(lián)結(jié)應(yīng)用程序、各種對象、CORBA服務(wù)、CORBA工具集的核心。ORB接口結(jié)構(gòu)動態(tài)調(diào)用接口

DII靜態(tài)調(diào)用接口直接調(diào)用一些ORB內(nèi)部的功能

PortableObjectAdapterCORBA允許用戶以兩種不同的方式提出對象請求:1.靜態(tài)調(diào)用:通過給定接口的存根,在編譯了對象代碼后,進入客戶端的程序。因此,靜態(tài)調(diào)用必須在編譯時就知道對象及其類型。

2.動態(tài)調(diào)用:

通過ORB的動態(tài)調(diào)用接口DII,在運行時生成訪問對象的代碼。

DII:DynamicInvocationInterfaceORB的任務(wù)是:找出所要對象的位置,激活該對象,向?qū)ο髠鬟f此請求。對象執(zhí)行所請求的服務(wù)后,把輸出值返回給ORB,然后再由ORB返回給客戶。ORBCLIENTSTUBSSKELETONSSERVERORBIIOPMETHODREQUESTOBJECTREFERENCESERVANTCORBA一次請求過程InternetInter-ORBProtocolCORBAORB優(yōu)點:1.靜態(tài)和動態(tài)方法調(diào)用。2.高級語言綁定。//CORBAORB并不介意服務(wù)對象是用何種語言編寫。3.位置透明。//ORB能夠單機模式運行,也能通過IIOP與其它ORB互連。4.內(nèi)置安全和事物處理。5.與遺留系統(tǒng)(legacysystem)共存。//CORBA能夠讓對象的定義與實現(xiàn)分離。使用IDL將原有的過程或函數(shù)封裝。1.4.3IDL(InterfaceDefinitionLanguage)接口定義語言O(shè)MGIDL接口定義語言不是作為程序設(shè)計語言體現(xiàn)在CORBA體系結(jié)構(gòu)中的,而是用來描述產(chǎn)生對象調(diào)用請求的客戶對象和服務(wù)對象之間的接口的語言。OMGIDL文件描述了服務(wù)器提供的服務(wù)功能,客戶機可以根據(jù)該接口文件描述的方法向服務(wù)器提出業(yè)務(wù)請求。在大多數(shù)CORBA產(chǎn)品中都提供IDL到相關(guān)編程語言的編譯器。//就是ORB

如:JavaIDL即idlj編譯器idl-to-c++compilerOMGIDL文件接口倉庫OMGIDL編譯器客戶端本地代理(stub)服務(wù)器框架(skeleton)客戶機應(yīng)用服務(wù)器應(yīng)用IDL文件的應(yīng)用過程IDL-DefinitionClient

ProgramSourceObjekt

ImplementSourceIDL-CompilerSkeleton

SourceStub

SourceJava/C++CompilerClient-ProgramJava/C++CompilerObjekt-Implement使用CORBA應(yīng)用開發(fā)圖示OMGIDL的語法規(guī)則(參閱IDL手冊)1.模塊定義模塊指定一個獨立的名字空間,類似于C++的名字空間

//Compute.idlmoduleCompute

{typedefdoubleradius;

typedeflongtimes;

interfacePI{doublegetResult(inradiusaRadius,intimestime);};……};

2.接口interfaceinterface

JobManager

{readonlyattributestringfirstName;

attributestringstatus;

stringQueryJobStatus(inlongnumber,outstringproperty);};類型聲明符號typedef與C++一樣IDL模塊和接口moduleFruitsBasket{interfaceApple{……};interfaceOrange{……};};從VegetablesBasket

模塊中引用

Apple要這樣做:FruitsBasket::Apple。moduleFruitsBasket{interfaceApple{……};};moduleFruitsBasket{interfaceOrange{……};};#include"orange.idl"moduleFruitsBasket{interfaceApple{……};};1.2.3.IDL范例:moduleMeineBank{

exceptionBankFehler{//異常定義

stringinfo;

};

//基本賬戶

interfaceBasisKonto{

readonlyattributelongnummer;

doubleeinzahlen(indoublebetrag)raises(BankFehler)//存錢

};

//接口繼承---支票賬號

interfaceGiroKonto:BasisKonto{

doubleattributedispoKredit;//信貸額度

};

//儲蓄賬號

interfaceSparKonto:BasisKonto{

doubleattributezinssatz;//存款利率

};

//接口多重繼承

interfaceGiroSparKonto:SparKonto,GiroKonto{......};

};

我的銀行必須為操作中的每一個參數(shù)指明方向?qū)傩詉n:由客戶機在運行時聲明參數(shù)的類型并賦值,服務(wù)器只能使用不能修改其值。out:由客戶機在運行時聲明參數(shù)的類型,服務(wù)器運行中為其賦值。inout:由客戶機在運行時聲明參數(shù)的類型并賦值,服務(wù)器可以使用或修改其值。3.基本數(shù)據(jù)類型shortlongunsignedshortunsignedlongfloatdoublecharbooleanoctetany

any可以和任意的數(shù)據(jù)類型匹配,也可以在運行中被動態(tài)轉(zhuǎn)換為任意數(shù)據(jù)類型。像C++中的Variant。4.構(gòu)造數(shù)據(jù)類型和數(shù)組structunionenumsequencestringtypedefstring<80>aName;typedefsequence<long,80>aSequence;typedeflongaDimension[20][100];enum

GoodsStatus{GOODS_SALED,GOODS_INSTOCK};1.4.4創(chuàng)建CORBA應(yīng)用程序CORBA對象服務(wù)的實現(xiàn)方式分兩種:1.對象的命名引用方式//常用方式2.字符串化對象引用方式創(chuàng)建CORBA應(yīng)用程序的過程:進行系統(tǒng)分析,確定服務(wù)對象需要提供的功能。根據(jù)分析結(jié)果,編寫IDL文件。編譯接口文件,產(chǎn)生服務(wù)對象的骨架與客戶本地代理。基于服務(wù)器框架,編寫服務(wù)對象實現(xiàn)程序?;诳蛻舳吮镜卮?,編寫客戶對象調(diào)用程序。編譯客戶對象和服務(wù)對象程序。啟動服務(wù)對象程序。啟動客戶對象程序。//Hello.idlinterfaceHello{voidsay_hello();};IDL-to-C++translatorHello.h

Hello.cpp

Hello_skel.h

Hello_skel.cppIDL-to-JavatranslatorHello.java

HelloHelper.java

HelloHolder.java

HelloOperations.java

HelloPOA.java

_HelloStub.javaCORBA實例服務(wù)對象接口定義:通過兩種不同的IDL編譯器:Hello-ObjectinC++#include“Hello_skel.h”classHello_impl:publicPOA_Hello{public:virtualvoidsay_hello()throw(CORBA::SystemException);};#include<iostream.h>#include<OB/CORBA.h>#include“Hello_impl.h”voidHello_impl::say_hello()throw(CORBA::SystemException){

cout<<"HelloWorld!"<<endl;}定義頭文件Hello_impl.h實現(xiàn)頭文件Hello_impl.cppServer-PrograminC++#include<OB/CORBA.h>#include<Hello_impl.h>#include<fstream.h>intmain(int

argc,char*argv[]){try{

CORBA::ORB_varorb=CORBA::ORB_init(argc,argv);

CORBA::Object_var

poaObj=orb->resolve_initial_references("RootPOA");

PortableServer::POA_var

rootPoa=PortableServer::POA::_narrow(poaObj);

PortableServer::POAManager_varmanager=rootPoa->the_POAManager();

Hello_impl*helloImpl=newHello_impl();

Hello_varhello=helloImpl->_this();

CORBA::String_vars=orb->object_to_string(hello);constchar*refFile="Hello.ref";

ofstream

out(refFile);out<<s<<endl;out.close();manager->activate();orb->run();orb->destroy();}catch(constCORBA::Exception&e){cerr<<e<<endl;

}}打開POA創(chuàng)建一個實例的引用保存IORPOA激活ORB啟動

等待ClientsInteroperableObjectReference可互操作對象引用

Client-PrograminJavapublicclassClient{publicstaticvoidmain(String[]

args){java.util.Propertiesprops=System.getProperties();

try{

org.omg.CORBA.ORBorb=org.omg.CORBA.ORB.init(args,props);

org.omg.CORBA.Object

obj=null;StringrefFile="Hello.ref";

java.io.BufferedReaderin=newjava.io.BufferedReader(newjava.io.FileReader(refFile));Stringref=in.readLine();

obj=orb.string_to_object(ref);Hellohello=HelloHelper.narrow(obj);

hello.say_hello();

orb.destroy(); }catch(Exceptione){e.printStackTrace();}}讀出IOR字符串還原為對象引用采用何種語言完全取決于自己的編程愛好//Hello_impl.javapublicclassHello_implextendsHelloPOA{publicvoidsay_hello(){

System.out.println("HelloWorld!");}}如Hello_impl.java實現(xiàn)Hello-ObjectinJavaServerinC++使用Name

Service方式#include<OB/CORBA.h>#include<Hello_impl.h>#include<fstream.h>intmain(int

argc,char*argv[]){try{

CORBA::ORB_varorb=CORBA::ORB_init(argc,argv);

CORBA::Object_var

poaObj=orb->resolve_initial_references("RootPOA");

PortableServer::POA_var

rootPoa=PortableServer::POA::_narrow(poaObj);

PortableServer::POAManager_varmanager=rootPoa->the_POAManager();

Hello_impl*helloImpl=newHello_impl();

Hello_varhello=helloImpl->_this();

CORBA::String_vars=orb->object_to_string(hello);constchar*refFile="Hello.ref";

ofstream

out(refFile);out<<s<<endl;

out.close();manager->activate();orb->run();orb->destroy();}catch(constCORBA::Exception&e){cerr<<e<<endl;

}}

CORBA::Object_varns=orb->resolve_initial_references("NameService");

CosNaming::NamingContext_var

nc=CosNaming::NamingContext::_narrow(ns.in());

CosNaming::Name

aName;aName.length(1);aName[0].id=CORBA::string_dup("hello");aName[0].kind=CORBA::string_dup("");

nc->bind(aName,hello.in());ClientinJava使用NameService方式publicclassClient{publicstaticvoidmain(

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論