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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

(IIOPInternetInter-ORBProtocol)完全基于面向對象技術6.現在,CORBA3.0更好支持EJB和JavaRMI

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

什么是CORBA?CORBA是由OMG組織制訂的一種標準的面向對象應用程序體系結構(規范),為解決分布式處理環境(DCE)中,硬件和軟件系統的互連而提出的一種解決方案。DCE:DistributedComputingEnvironment

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

DII靜態調用接口直接調用一些ORB內部的功能

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

2.動態調用:

通過ORB的動態調用接口DII,在運行時生成訪問對象的代碼。

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

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

ProgramSourceObjekt

ImplementSourceIDL-CompilerSkeleton

SourceStub

SourceJava/C++CompilerClient-ProgramJava/C++CompilerObjekt-Implement使用CORBA應用開發圖示OMGIDL的語法規則(參閱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{......};

};

我的銀行必須為操作中的每一個參數指明方向屬性in:由客戶機在運行時聲明參數的類型并賦值,服務器只能使用不能修改其值。out:由客戶機在運行時聲明參數的類型,服務器運行中為其賦值。inout:由客戶機在運行時聲明參數的類型并賦值,服務器可以使用或修改其值。3.基本數據類型shortlongunsignedshortunsignedlongfloatdoublecharbooleanoctetany

any可以和任意的數據類型匹配,也可以在運行中被動態轉換為任意數據類型。像C++中的Variant。4.構造數據類型和數組structunionenumsequencestringtypedefstring<80>aName;typedefsequence<long,80>aSequence;typedeflongaDimension[20][100];enum

GoodsStatus{GOODS_SALED,GOODS_INSTOCK};1.4.4創建CORBA應用程序CORBA對象服務的實現方式分兩種:1.對象的命名引用方式//常用方式2.字符串化對象引用方式創建CORBA應用程序的過程:進行系統分析,確定服務對象需要提供的功能。根據分析結果,編寫IDL文件。編譯接口文件,產生服務對象的骨架與客戶本地代理。基于服務器框架,編寫服務對象實現程序。基于客戶端本地代理,編寫客戶對象調用程序。編譯客戶對象和服務對象程序。啟動服務對象程序。啟動客戶對象程序。//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實例服務對象接口定義:通過兩種不同的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實現頭文件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創建一個實例的引用保存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實現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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論