中間件-5CORBA編程簡(jiǎn)介_(kāi)第1頁(yè)
中間件-5CORBA編程簡(jiǎn)介_(kāi)第2頁(yè)
中間件-5CORBA編程簡(jiǎn)介_(kāi)第3頁(yè)
中間件-5CORBA編程簡(jiǎn)介_(kāi)第4頁(yè)
中間件-5CORBA編程簡(jiǎn)介_(kāi)第5頁(yè)
已閱讀5頁(yè),還剩121頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

簡(jiǎn)單Corba程序設(shè)計(jì)CORBA應(yīng)用開(kāi)發(fā)過(guò)程CORBA規(guī)范并沒(méi)有限制ORB的具體實(shí)現(xiàn)方法,所以不同廠商對(duì)ORB的具體實(shí)現(xiàn)方法可能差別很大,這就導(dǎo)致不同廠商提供的ORB上操作可能有很大的差異。但基本過(guò)程都是類(lèi)似的。開(kāi)發(fā)環(huán)境Inprise

VisiBroker

4.5+JDK1.3+UltraEditInprise

Visibroker5+JDK1.4(+Jbuilder/SunOneStudioEE)靜態(tài)工作方式客戶方對(duì)象實(shí)現(xiàn)方IDL樁(客戶方代理)IDL構(gòu)架(服務(wù)方代理)ORB內(nèi)核設(shè)計(jì)一個(gè)靜態(tài)方式的程序IDL文件對(duì)象實(shí)現(xiàn)IDL編譯器JavaC++…IDL樁JavaC++…IDL構(gòu)架JavaC++…客戶方調(diào)用服務(wù)方主程序IDL語(yǔ)言契約式語(yǔ)言,定義組件接口,不定義實(shí)現(xiàn)。語(yǔ)法上可以看成C++的一個(gè)子集,規(guī)定組件的屬性、所繼承的父類(lèi)、產(chǎn)生的異常、事件和各類(lèi)數(shù)據(jù)類(lèi)型。預(yù)編譯系統(tǒng)可以直接從IDL描述產(chǎn)生客戶樁和服務(wù)器實(shí)現(xiàn)框架。對(duì)象接口與對(duì)象實(shí)現(xiàn)接口與對(duì)象實(shí)現(xiàn)之間是多對(duì)多關(guān)系對(duì)象接口的定義應(yīng)包括對(duì)象的類(lèi)型名字,對(duì)象上可進(jìn)行的操作,屬性,相關(guān)的數(shù)據(jù)類(lèi)型定義,常量定義,異常定義等信息接口定義語(yǔ)言對(duì)象實(shí)現(xiàn)對(duì)外提供信息和服務(wù)信息和服務(wù)是對(duì)象實(shí)現(xiàn)與客戶程序之間的一種合約接口定義語(yǔ)言是書(shū)寫(xiě)這種合約的標(biāo)準(zhǔn)語(yǔ)言IDL是一種說(shuō)明性語(yǔ)言,不是程序設(shè)計(jì)語(yǔ)言IDL的特點(diǎn)面向?qū)ο笥糜诙x分布式服務(wù)的規(guī)格說(shuō)明定義復(fù)雜的數(shù)據(jù)類(lèi)型獨(dú)立于具體的程序設(shè)計(jì)語(yǔ)言和特定的硬件,網(wǎng)絡(luò)和操作系統(tǒng)平臺(tái)設(shè)計(jì)一個(gè)靜態(tài)方式的程序IDL文件對(duì)象實(shí)現(xiàn)IDL編譯器JavaC++…IDL樁JavaC++…IDL構(gòu)架JavaC++…客戶方調(diào)用服務(wù)方主程序1.4典型的CORBA應(yīng)用實(shí)現(xiàn)過(guò)程用IDL編寫(xiě)對(duì)象規(guī)格說(shuō)明編譯IDL生成樁和框架編寫(xiě)客戶程序代碼編寫(xiě)對(duì)象實(shí)現(xiàn)和服務(wù)程序代碼編譯客戶程序編譯服務(wù)程序運(yùn)行客戶程序運(yùn)行服務(wù)程序啟動(dòng)對(duì)象請(qǐng)求代理(ORB)內(nèi)核一個(gè)典型CORBA應(yīng)用的實(shí)現(xiàn)過(guò)程例子背景銀行賬戶管理服務(wù)端管理大量銀行顧客的賬戶,提供基本的開(kāi)戶、存款、取款、查詢余額的功能。對(duì)象認(rèn)定一個(gè)銀行帳戶的實(shí)體模型。balance:表示當(dāng)前的余額。deposit:存款withdraw:取款getBalance:查詢余額manage銀行中的儲(chǔ)蓄員的實(shí)體模型。accountList

:記錄當(dāng)前已開(kāi)設(shè)的所有帳戶。open:根據(jù)帳戶標(biāo)識(shí)查找某一帳戶,如果該標(biāo)識(shí)的帳戶不存在則創(chuàng)建一個(gè)新帳戶。定義對(duì)象接口//銀行帳戶管理系統(tǒng)的對(duì)象接口定義moduleBank{//帳戶

interfaceAccount{//存款

voiddeposit(infloatamount);//取款

booleanwithdraw(infloatamount);//查詢余額

floatgetBalance();};

//帳戶管理員

interfaceAccountManager{//查詢指定名字的帳戶,查無(wú)則新開(kāi)帳戶

Accountopen(instringname);};};Bank.idl生成Stub與SkeletonIDL編譯器作用是將IDL映射到具體程序設(shè)計(jì)語(yǔ)言,產(chǎn)生樁代碼和框架代碼Visibrokerforjava提供的編譯器idl2java將IDL映射到j(luò)ava語(yǔ)言,生成java語(yǔ)言的樁和框架語(yǔ)言每個(gè)對(duì)象實(shí)例都有一個(gè)用于唯一標(biāo)識(shí)自身的對(duì)象引用。客戶程序利用對(duì)象引用指明調(diào)用的方向表面上看,客戶程序調(diào)用的是遠(yuǎn)程對(duì)象實(shí)現(xiàn)上的操作,實(shí)際被調(diào)用的代碼是作為其代理的IDL樁生成Stub與Skeletonprompt>idl2javaBank.idlidl2javaBank.idlStubSkeleton輸入輸出其它輔助文件生成Stub與SkeletonVisiBrokerforJava的IDL編譯器idl2java為每個(gè)接口自動(dòng)生成7個(gè)文件:AccountOperations.javaAccount.java_AccountStub.javaAccountPOA.javaAccountPOATie.javaAccountHelper.javaAccountHolder.java

生成的接口定義Account.java和AccountOperations.java定義了IDL接口Account的完整基調(diào)。AccountOperations.java(操作基調(diào))定義了Account接口中定義的所有常量和方法。packageBank;

publicinterfaceAccountOperations//操作接口{publicvoiddeposit(floatamount);publicbooleanwithdraw(floatamount);publicfloatgetBalance();}生成的接口定義客戶程序代碼中,程序員通常使用的是操作接口的派生接口,Account(位于Account.java)packageBank;

publicinterfaceAccountextendscom.inprise.vbroker.CORBA.Object,

Bank.AccountOperations,

org.omg.CORBA.portable.IDLEntity{}

生成的Stub_AccountStub.java是Account對(duì)象在客戶端的樁代碼,它實(shí)現(xiàn)了Account接口。程序員編寫(xiě)的客戶程序代碼通常不直接調(diào)用這個(gè)類(lèi)中的方法。VisiBrokerforJava生成了另外的輔助類(lèi)AccountHelper。該類(lèi)提供了一個(gè)narrow方法,用于返回一個(gè)Account接口的指針。實(shí)際上該方法實(shí)例化了一個(gè)_AccountStub對(duì)象,所以客戶端通過(guò)返回的接口指針實(shí)際調(diào)用了樁對(duì)象的代碼,由樁對(duì)象完成具體的和服務(wù)端的通信。生成的StubpackageBank;

publicclass_AccountStubextendscom.inprise.vbroker.CORBA.portable.ObjectImpl

implementsAccount{finalpublicstaticjava.lang.Class_opsClass=

Bank.AccountOperations.class;privatestaticjava.lang.String[]__ids= {"IDL:Bank/Account:1.0"};

publicjava.lang.String[]_ids(){return__ids;}

publicvoiddeposit(floatamount){ //與ORB交互,完成真正的deposit方法調(diào)用

}publicbooleanwithdraw(floatamount){ //與ORB交互,完成真正的withdraw方法調(diào)用

}publicfloatgetBalance(){ //與ORB交互,完成真正的getBalance方法調(diào)用

}}_AccountStub.java生成的SkeletonAccountPOA.java是Account對(duì)象的服務(wù)端框架代碼,該類(lèi)的功能:解包in類(lèi)型的參數(shù)并將參數(shù)傳遞給對(duì)象實(shí)現(xiàn)。打包返回值與所有out類(lèi)型的參數(shù)。打包(marshal):指將特定程序設(shè)計(jì)語(yǔ)言描述的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為CORBA的IIOP流格式。解包(unmarshal):從IIOP流格式轉(zhuǎn)換為依賴(lài)于具體程序設(shè)計(jì)語(yǔ)言的數(shù)據(jù)結(jié)構(gòu)。編寫(xiě)對(duì)象實(shí)現(xiàn)的最簡(jiǎn)單途徑是繼承這些POA類(lèi),即把它們作為對(duì)象實(shí)現(xiàn)的基類(lèi)。生成的SkeletonpackageBank;

publicabstractclassAccountPOA

extendsorg.omg.PortableServer.Servantimplementsorg.omg.CORBA.portable.InvokeHandler,

Bank.AccountOperations{publicstaticorg.omg.CORBA.portable.OutputStream_invoke( ...){

org.omg.CORBA.portable.OutputStream_output=null;{switch(_method_id){case0:{

floatamount;amount=_input.read_float();_self.deposit(amount);_output=_handler.createReply();return_output;}case1:{//... }case2:{//... }}}}}AccountPOA.java生成的紐帶機(jī)制AccountPOATie.java用于采用紐帶機(jī)制實(shí)現(xiàn)服務(wù)端的Account對(duì)象生成的輔助工具類(lèi)

IDL編譯器為每一個(gè)用戶自定義類(lèi)型還生成一個(gè)輔助工具類(lèi)。AccountHelper.java聲明了AccountHelper類(lèi),該類(lèi)為Account接口定義了許多實(shí)用功能和支持功能的靜態(tài)方法(又稱(chēng)類(lèi)方法)。從Any對(duì)象提取或向Any對(duì)象插入對(duì)象(extract和insert方法);從輸入/輸出流讀寫(xiě)對(duì)象(read和write方法);獲取對(duì)象的庫(kù)標(biāo)識(shí)和類(lèi)型碼(id和type方法);綁定對(duì)象與類(lèi)型轉(zhuǎn)換操作(bind和narrow方法)等等。編程時(shí)會(huì)用到該類(lèi)中提供的方法。生成的輔助工具類(lèi)packageBank;

publicfinalclassAccountHelper{publicstaticBank.Accountnarrow (finalorg.omg.CORBA.Object

obj){//...}

publicstaticBank.Accountbind(org.omg.CORBA.ORBorb, java.lang.Stringname){//...}//...}

AccountHelper.java生成的對(duì)象傳遞支撐類(lèi)AccountHolder.java聲明的AccountHolder類(lèi)為傳遞對(duì)象提供支持。IDL有三種參數(shù)傳遞方式:in、out和inout。in類(lèi)型的參數(shù)以及返回結(jié)果與Java的參數(shù)傳遞方式與結(jié)果返回方式完全相同。out和inout兩種類(lèi)型的參數(shù)允許參數(shù)具有返回結(jié)果的能力,無(wú)法直接映射到Java語(yǔ)言的參數(shù)傳遞機(jī)制,這時(shí)AccountHolder類(lèi)為傳遞out和inout參數(shù)提供了一個(gè)托架(holder)。生成的對(duì)象傳遞支撐類(lèi)packageBank;

publicfinalclassAccountHolderimplementsorg.omg.CORBA.portable.Streamable{publicBank.Accountvalue;

publicAccountHolder(){}

publicAccountHolder(finalBank.Account_vis_value){this.value=_vis_value;}

publicvoid_read( finalorg.omg.CORBA.portable.InputStreaminput){value=Bank.AccountHelper.read(input);}

publicvoid_write(final

org.omg.CORBA.portable.OutputStreamoutput){

Bank.AccountHelper.write(output,value);}

publicorg.omg.CORBA.TypeCode_type(){returnBank.AccountHelper.type();}}

AccountHolder.java編寫(xiě)對(duì)象實(shí)現(xiàn)對(duì)象實(shí)現(xiàn)代碼所在的類(lèi)名字可由程序員自由掌握,只要不與IDL編譯器自動(dòng)產(chǎn)生的Java類(lèi)產(chǎn)生名字沖突即可??蛻舫绦蛞矡o(wú)須了解對(duì)象實(shí)現(xiàn)是由哪一個(gè)Java類(lèi)完成的。CORBA應(yīng)用程序的對(duì)象實(shí)現(xiàn)最常用、最簡(jiǎn)單的實(shí)現(xiàn)方式是使用繼承,即直接繼承由IDL編譯器生成的xxxPOA類(lèi)。我們的例子程序采用簡(jiǎn)單的繼承方式編寫(xiě)對(duì)象實(shí)現(xiàn)。賬戶的對(duì)象實(shí)現(xiàn)publicclassAccountImpl

extendsBank.AccountPOA{//屬性定義

protectedfloatbalance;

//構(gòu)造方法,按指定余額創(chuàng)建新的帳戶

publicAccountImpl(floatbal){balance=bal;}

//往帳戶中存款

publicvoiddeposit(floatamount){balance+=amount;}

//從帳戶中取款,不足余額則返回falsepublicboolean

withdraw(floatamount){if(balance<amount)returnfalse;else{balance-=amount;returntrue;}}//查詢帳戶余額publicfloatgetBalance(){returnbalance}}

AccountImpl.java賬戶管理員的對(duì)象實(shí)現(xiàn)publicclassAccountManagerImpl

extendsBank.AccountManagerPOA{protectedHashtable

accountList;//該帳戶管理員所負(fù)責(zé)的帳戶清單

publicAccountManagerImpl(){

accountList=newHashtable();}publicsynchronizedBank.Accountopen(Stringname){Bank.Accountaccount=(Bank.Account)accountList.get(name);if(account==null){Randomrandom=newRandom();floatbalance=Math.abs(random.nextInt())%100000/100f;

AccountImpl

accountServant=newAccountImpl(balance);try{

org.omg.CORBA.Object

obj=_default_POA().servant_to_reference(accountServant); account=Bank.AccountHelper.narrow(obj);}catch(Exceptionexc){

exc.printStackTrace();}

accountList.put(name,account);

System.out.println("新開(kāi)帳戶:"+name);}returnaccount;}}AccountManagerImpl.java編寫(xiě)服務(wù)程序通常程序員都會(huì)編寫(xiě)一個(gè)名為Server.java的服務(wù)程序,服務(wù)程序創(chuàng)建伺服對(duì)象供客戶端使用。編寫(xiě)服務(wù)程序初始化ORB創(chuàng)建一個(gè)POA創(chuàng)建提供服務(wù)的伺服對(duì)象激活伺服對(duì)象激活POA管理器等待客戶程序發(fā)來(lái)請(qǐng)求服務(wù)程序的處理流程編寫(xiě)服務(wù)程序publicclassServer{publicstaticvoidmain(String[]args){try{

org.omg.CORBA.ORBorb=org.omg.CORBA.ORB.

init(args,null);POArootPOA=POAHelper.narrow(

orb.resolve_initial_references("RootPOA"));

org.omg.CORBA.Policy[]policies={

rootPOA.create_lifespan_policy(

LifespanPolicyValue.PERSISTENT)};POAmyPOA=rootPOA.create_POA("BankPOA",

rootPOA.the_POAManager(),policies);

AccountManagerImpl

managerServant= newAccountManagerImpl();

myPOA.activate_object_with_id("BankManager".getBytes(),managerServant);

rootPOA.the_POAManager().activate();

System.out.println("帳戶管理員BankManager已就緒...\n");orb.run();}catch(Exceptionexc){

exc.printStackTrace();}}}服務(wù)程序Server.java初始化ORB創(chuàng)建一個(gè)POA創(chuàng)建提供服務(wù)的伺服對(duì)象激活伺服對(duì)象激活POA管理器等待客戶程序發(fā)來(lái)請(qǐng)求編寫(xiě)客戶程序初始化ORB綁定到服務(wù)對(duì)象調(diào)用服務(wù)對(duì)象提供的服務(wù)客戶程序操作流程編寫(xiě)客戶程序publicclassClient{publicstaticvoidmain(String[]args){

org.omg.CORBA.ORBorb=org.omg.CORBA.ORB.init(args,null);//利用POA全稱(chēng)與對(duì)象標(biāo)識(shí)"BankManager"查找?guī)艄芾韱T

Bank.AccountManagermanager=

Bank.AccountManagerHelper.bind( orb,"/BankPOA","BankManager".getBytes());Stringname=args.length>0?args[0]:"DavidZeng";//請(qǐng)求帳戶管理員找出一個(gè)指定名字的帳戶,無(wú)此帳戶則新開(kāi)一個(gè)

Bank.Accountaccount=manager.open(name);

System.out.println(name+“的帳戶余額為”+

account.getBalance()+"元");account.deposit(200);

System.out.println(“存款200元后,余額為”+

account.getBalance()+“元”);if(account.withdraw(600)){

System.out.println(“取款600元后,余額為”+

account.getBalance()+"元");}else{

System.out.println("余額不足600元,取款失敗,余額保持不變");}}}客戶程序Client.java《interface》org.omg.CORBA.Objectorg.omg.portable.ObjectImpl_AccountStub《interface》AccountOperations《interface》AccountClientorg.omg.PortableServer.DynamicImplemantationorg.omg.portableServer.ServantAccountPOAAccountPOATieAccountDelegateAccountImpl委托使用implementServercreateclientServer2manager.open(name)manager:AccountManageraccountList:Hashtable...managerServant:AccountManagerImpl1AccountManagerImpl

managerServant=newAccountManagerImpl();Accountaccount=(Account)accountList.get(name);orbput(name,account)accountServant:AccountImplopen(name)ORBservant_to_referenceaccount:AccountAccountHelper.narrow()注冊(cè)account.deposit(200)編譯應(yīng)用程序利用VisiBrokerforJava提供的編譯器vbjc完成這一工作:prompt>vbjcServer.javaprompt>vbjcClient.javavbjc實(shí)際上封裝了JDK提供的Java編譯器。Holder類(lèi)和POATie類(lèi)需要指定額外的參數(shù)才會(huì)生成。運(yùn)行應(yīng)用程序按一定的順序啟動(dòng)應(yīng)用程序1.啟動(dòng)智能代理運(yùn)行CORBA應(yīng)用程序之前,網(wǎng)絡(luò)中必須至少有一臺(tái)主機(jī)上啟動(dòng)了智能代理osagent。這是VisiBroker特有的分布式位置服務(wù)(locationservice)守護(hù)進(jìn)程,網(wǎng)絡(luò)中多個(gè)智能代理可協(xié)作以查找合適的對(duì)象實(shí)現(xiàn)。prompt>osagent

2.啟動(dòng)服務(wù)程序prompt>startvbjServer3.啟動(dòng)客戶程序prompt>vbjClient

開(kāi)發(fā)過(guò)程小結(jié)設(shè)計(jì)一個(gè)靜態(tài)方式的程序IDL文件對(duì)象實(shí)現(xiàn)IDL編譯器JavaC++…IDL樁JavaC++…IDL構(gòu)架JavaC++…客戶方調(diào)用服務(wù)方主程序典型的CORBA應(yīng)用實(shí)現(xiàn)過(guò)程用IDL編寫(xiě)對(duì)象規(guī)格說(shuō)明編譯IDL生成樁和框架編寫(xiě)客戶程序代碼編寫(xiě)對(duì)象實(shí)現(xiàn)和服務(wù)程序代碼編譯客戶程序編譯服務(wù)程序運(yùn)行客戶程序運(yùn)行服務(wù)程序啟動(dòng)對(duì)象請(qǐng)求代理(ORB)內(nèi)核一個(gè)典型CORBA應(yīng)用的實(shí)現(xiàn)過(guò)程定義對(duì)象接口//銀行帳戶管理系統(tǒng)的對(duì)象接口定義moduleBank{//帳戶

interfaceAccount{//存款

voiddeposit(infloatamount);//取款

booleanwithdraw(infloatamount);//查詢余額

floatgetBalance();};

//帳戶管理員

interfaceAccountManager{//查詢指定名字的帳戶,查無(wú)則新開(kāi)帳戶

Accountopen(instringname);};};Bank.idl生成Stub與SkeletonVisiBrokerforJava的IDL編譯器idl2java為每個(gè)接口自動(dòng)生成7個(gè)文件:AccountOperations.javaAccount.java_AccountStub.javaAccountPOA.javaAccountPOATie.javaAccountHelper.javaAccountHolder.java

賬戶的對(duì)象實(shí)現(xiàn)publicclassAccountImpl

extendsBank.AccountPOA{//屬性定義

protectedfloatbalance;

//構(gòu)造方法,按指定余額創(chuàng)建新的帳戶

publicAccountImpl(floatbal){balance=bal;}

//往帳戶中存款

publicvoiddeposit(floatamount){balance+=amount;}

//從帳戶中取款,不足余額則返回falsepublicboolean

withdraw(floatamount){if(balance<amount)returnfalse;else{balance-=amount;returntrue;}}//查詢帳戶余額publicfloatgetBalance(){returnbalance}}AccountImpl.java編寫(xiě)服務(wù)程序publicclassServer{publicstaticvoidmain(String[]args){try{

org.omg.CORBA.ORBorb=org.omg.CORBA.ORB.init(args,null);POArootPOA=POAHelper.narrow(

orb.resolve_initial_references("RootPOA"));

org.omg.CORBA.Policy[]policies={

rootPOA.create_lifespan_policy(

LifespanPolicyValue.PERSISTENT)};POAmyPOA=rootPOA.create_POA("BankPOA",

rootPOA.the_POAManager(),policies);

AccountManagerImpl

managerServant= newAccountManagerImpl();

myPOA.activate_object_with_id("BankManager".getBytes(),managerServant);rootPOA.the_POAManager().activate();

System.out.println("帳戶管理員BankManager已就緒...\n");orb.run();}catch(Exceptionexc){

exc.printStackTrace();}}}服務(wù)程序Server.java初始化ORB創(chuàng)建一個(gè)POA創(chuàng)建提供服務(wù)的伺服對(duì)象激活伺服對(duì)象激活POA管理器等待客戶程序發(fā)來(lái)請(qǐng)求編寫(xiě)客戶程序publicclassClient{publicstaticvoidmain(String[]args){

org.omg.CORBA.ORBorb=org.omg.CORBA.ORB.init(args,null);//利用POA全稱(chēng)與對(duì)象標(biāo)識(shí)"BankManager"查找?guī)艄芾韱T

Bank.AccountManagermanager=

Bank.AccountManagerHelper.bind( orb,"/BankPOA","BankManager".getBytes());Stringname=args.length>0?args[0]:"DavidZeng";//請(qǐng)求帳戶管理員找出一個(gè)指定名字的帳戶,無(wú)此帳戶則新開(kāi)一個(gè)

Bank.Accountaccount=manager.open(name);

System.out.println(name+“的帳戶余額為”+

account.getBalance()+"元");

account.deposit(200);

System.out.println(“存款200元后,余額為”+

account.getBalance()+“元”);if(account.withdraw(600)){

System.out.println(“取款600元后,余額為”+

account.getBalance()+"元");}else{

System.out.println("余額不足600元,取款失敗,余額保持不變");}}}客戶程序Client.java初始化ORB綁定到服務(wù)對(duì)象調(diào)用服務(wù)對(duì)象提供的服務(wù)編寫(xiě)服務(wù)端程序Agenda對(duì)象適配器可移植對(duì)象適配器設(shè)計(jì)POA策略使用POA活動(dòng)對(duì)象映射表伺服對(duì)象管理器CORBA對(duì)象與伺服對(duì)象CORBA對(duì)象與具體的伺服對(duì)象是兩個(gè)不同抽象層次的概念:它們之間的徹底分離使得CORBA獨(dú)立于任何特定程序設(shè)計(jì)語(yǔ)言,并為服務(wù)端程序的可移植性打下基礎(chǔ)。對(duì)象適配器(objectadapter)是一個(gè)重要的ORB組件,它負(fù)責(zé)將抽象的CORBA對(duì)象映射到具體的伺服對(duì)象。CORBA對(duì)象可看作是一個(gè)具有對(duì)象標(biāo)識(shí)、對(duì)象接口及對(duì)象實(shí)現(xiàn)的抽象實(shí)體。之所以稱(chēng)為抽象的,是因?yàn)椴](méi)有硬性規(guī)定CORBA對(duì)象的實(shí)現(xiàn)機(jī)制。由于獨(dú)立于程序設(shè)計(jì)語(yǔ)言和特定ORB產(chǎn)品,一個(gè)CORBA對(duì)象的引用又稱(chēng)可互操作的對(duì)象引用(InteroperableObjectReference)。從客戶程序的角度看,IOR中包含了對(duì)象的標(biāo)識(shí)、接口類(lèi)型及其他信息以查找對(duì)象實(shí)現(xiàn)。CORBA對(duì)象與伺服對(duì)象伺服對(duì)象(servant)是指具體程序設(shè)計(jì)語(yǔ)言的對(duì)象或?qū)嶓w,通常存在于一個(gè)服務(wù)程序進(jìn)程之中。客戶程序通過(guò)對(duì)象引用發(fā)出的請(qǐng)求經(jīng)過(guò)ORB擔(dān)當(dāng)中介角色,轉(zhuǎn)換為對(duì)特定的伺服對(duì)象的調(diào)用。在一個(gè)CORBA對(duì)象的生命期中,它可能與多個(gè)伺服對(duì)象相關(guān)聯(lián),因而對(duì)該對(duì)象的請(qǐng)求可能被發(fā)送到不同的伺服對(duì)象。對(duì)象標(biāo)識(shí)(ObjectID)是一個(gè)用于在POA中標(biāo)識(shí)一個(gè)CORBA對(duì)象的字符串。它既可由程序員指派,也可由對(duì)象適配器自動(dòng)分配,這兩種方式都要求對(duì)象標(biāo)識(shí)在創(chuàng)建它的對(duì)象適配器中必須具有唯一性。CORBA對(duì)象與伺服對(duì)象伺服對(duì)象通過(guò)對(duì)象標(biāo)識(shí)關(guān)聯(lián)到CORBA對(duì)象。建立一個(gè)伺服對(duì)象與一個(gè)CORBA對(duì)象之間關(guān)聯(lián)的過(guò)程稱(chēng)為“激活”(activate)或“體現(xiàn)”(incarnate),反之,撤銷(xiāo)這種關(guān)聯(lián)的過(guò)程稱(chēng)為“凍結(jié)”(deactivate)或“凈化”(etherealize)。經(jīng)過(guò)激活或體現(xiàn)后,CORBA對(duì)象、伺服對(duì)象以及對(duì)象標(biāo)識(shí)均可稱(chēng)為活動(dòng)的(active),否則稱(chēng)它們?yōu)榉腔顒?dòng)的(inactive)。不是簡(jiǎn)單的new持久對(duì)象(persistentobject)可在創(chuàng)建它的服務(wù)程序進(jìn)程之外存在,瞬時(shí)對(duì)象(transientobject)只能在創(chuàng)建它的服務(wù)程序進(jìn)程中存在。它們都是指一個(gè)CORBA對(duì)象。Corba對(duì)象《——》伺服對(duì)象

ID可移植對(duì)象適配器作用:管理服務(wù)器端伺服對(duì)象,對(duì)象標(biāo)識(shí),CORBA對(duì)象以及它們之間關(guān)聯(lián)的主要工具決定在收到一個(gè)客戶請(qǐng)求時(shí)應(yīng)調(diào)用哪一個(gè)伺服對(duì)象,然后調(diào)用該伺服對(duì)象上的合適操作創(chuàng)建CORBA對(duì)象引用,將其與伺服對(duì)象關(guān)聯(lián)是對(duì)象實(shí)現(xiàn)與ORB其他組件之間的中介,它將客戶請(qǐng)求傳送到伺服對(duì)象,按需創(chuàng)建子POA,提供管理伺服對(duì)象的策略。對(duì)CORBA對(duì)象發(fā)出的所有調(diào)用請(qǐng)求都必須經(jīng)過(guò)POA,即使目標(biāo)對(duì)象是本地的(即伺服對(duì)象與客戶程序處于同一地址空間),這樣POA能夠統(tǒng)一地應(yīng)用POA策略O(shè)RB內(nèi)核對(duì)象適配器對(duì)象實(shí)現(xiàn)POA體系結(jié)構(gòu)服務(wù)程序

伺服對(duì)象管理器

伺服對(duì)象1

客戶請(qǐng)求

伺服對(duì)象2伺服對(duì)象3POAPOA根POA注冊(cè)的伺服對(duì)象管理器

活動(dòng)對(duì)象映射表對(duì)象標(biāo)識(shí)1對(duì)象標(biāo)識(shí)2對(duì)象標(biāo)識(shí)3

POA管理器可移植對(duì)象適配器客戶請(qǐng)求的傳遞過(guò)程客戶程序發(fā)出的請(qǐng)求中包含:創(chuàng)建對(duì)象引用的POA名字、對(duì)象標(biāo)識(shí)及目標(biāo)機(jī)器與端口等信息。如果目標(biāo)POA不存在,ORB還允許調(diào)用適配器激活器創(chuàng)建所需的POA。服務(wù)程序

伺服對(duì)象管理器

伺服對(duì)象1

客戶請(qǐng)求

伺服對(duì)象2伺服對(duì)象3POAPOA根POA注冊(cè)的伺服對(duì)象管理器

活動(dòng)對(duì)象映射表對(duì)象標(biāo)識(shí)1對(duì)象標(biāo)識(shí)2對(duì)象標(biāo)識(shí)3

POA管理器一旦請(qǐng)求被ORB傳送到正確的機(jī)器與端口,監(jiān)聽(tīng)該端口的POA管理器負(fù)責(zé)檢查對(duì)象關(guān)鍵碼(objectkey),對(duì)象關(guān)鍵碼中含有POA名字與對(duì)象標(biāo)識(shí);POA管理器利用對(duì)象關(guān)鍵碼將請(qǐng)求傳送給正確的POA服務(wù)程序

伺服對(duì)象管理器

伺服對(duì)象1

客戶請(qǐng)求

伺服對(duì)象2伺服對(duì)象3POAPOA根POA注冊(cè)的伺服對(duì)象管理器

活動(dòng)對(duì)象映射表對(duì)象標(biāo)識(shí)1對(duì)象標(biāo)識(shí)2對(duì)象標(biāo)識(shí)3

POA管理器POA利用對(duì)象關(guān)鍵碼確定對(duì)象標(biāo)識(shí),根據(jù)POA的策略集直接或間接地利用對(duì)象標(biāo)識(shí)將請(qǐng)求傳送到正確的伺服對(duì)象。服務(wù)程序

伺服對(duì)象管理器

伺服對(duì)象1

客戶請(qǐng)求

伺服對(duì)象2伺服對(duì)象3POAPOA根POA注冊(cè)的伺服對(duì)象管理器

活動(dòng)對(duì)象映射表對(duì)象標(biāo)識(shí)1對(duì)象標(biāo)識(shí)2對(duì)象標(biāo)識(shí)3

POA管理器客戶請(qǐng)求的傳遞客戶程序POA管理器POA管理器正在監(jiān)聽(tīng)的端口號(hào)ORB對(duì)象定位信息請(qǐng)求內(nèi)容1.客戶程序向ORB發(fā)出請(qǐng)求對(duì)象定位信息請(qǐng)求內(nèi)容目標(biāo)機(jī)器、端口對(duì)象關(guān)鍵碼ORB2.ORB根據(jù)其中的目標(biāo)機(jī)器和端口信息將請(qǐng)求發(fā)送到指定端口目標(biāo)機(jī)器、端口對(duì)象關(guān)鍵碼客戶請(qǐng)求的傳遞POA名字對(duì)象標(biāo)識(shí)name1POA3.POA管理器根據(jù)請(qǐng)求中的POA名字將請(qǐng)求發(fā)送到特定的POA請(qǐng)求內(nèi)容name2POAPOA管理器管理多個(gè)POA...POA管理器POA名字name2POA活動(dòng)對(duì)象映射表對(duì)象標(biāo)識(shí)1對(duì)象標(biāo)識(shí)2對(duì)象標(biāo)識(shí)3

伺服對(duì)象1伺服對(duì)象2伺服對(duì)象3對(duì)象標(biāo)識(shí)請(qǐng)求內(nèi)容4.POA根據(jù)對(duì)象標(biāo)識(shí)將請(qǐng)求傳到正確的伺服對(duì)象附錄1POA接口

//POA接口

interfacePOA{//POA屬性

readonlyattributestringthe_name;

readonlyattributePOAthe_parent;

readonlyattributePOAListthe_children;

readonlyattributePOAManager

the_POAManager;attributeAdapterActivatorthe_activator;//異常定義

exceptionAdapterAlreadyExists{};exceptionAdapterNonExistent{};exceptionInvalidPolicy{unsignedshortindex;};exceptionNoServant{};exceptionObjectAlreadyActive{};exceptionObjectNotActive{};exceptionServantAlreadyActive{};exceptionServantNotActive{};exceptionWrongAdapter{};exceptionWrongPolicy{};POA接口POA接口

//創(chuàng)建與撤銷(xiāo)POAPOAcreate_POA(instringadapter_name, inPOAManager

a_POAManager, inCORBA::PolicyListpolicies)

raises(AdapterAlreadyExists,InvalidPolicy);POAfind_POA(instringadapter_name,inbooleanactivate_it)

raises(AdapterNonExistent);voiddestroy(inbooleanetherealize_objects, inbooleanwait_for_completion);//用于創(chuàng)建策略對(duì)象的factory操作

ThreadPolicycreate_thread_policy(inThreadPolicyValuevalue);

LifespanPolicycreate_lifespan_policy( inLifespanPolicyValuevalue);//...POA接口POA接口

//伺服對(duì)象管理器的注冊(cè)

ServantManagerget_servant_manager()

raises(WrongPolicy);voidset_servant_manager(inServantManager

imgr)

raises(WrongPolicy);//為USE_DEFAULT_SERVANT策略提供的操作

Servantget_servant()

raises(NoServant,WrongPolicy);voidset_servant(inServantp_servant)

raises(WrongPolicy);//對(duì)象激活與凍結(jié)

ObjectIdactivate_object(inServantp_servant)

raises(ServantAlreadyActive,WrongPolicy);voidactivate_object_with_id(inObjectIdid, inServantp_servant)

raises(ServantAlreadyActive,ObjectAlreadyActive,

WrongPolicy);voiddeactivate_object(inObjectId

oid)

raises(ObjectNotActive,WrongPolicy);POA接口POA接口

//創(chuàng)建CORBA對(duì)象引用的操作

Objectcreate_reference(inCORBA::RepositoryId

intf)

raises(WrongPolicy);Objectcreate_reference_with_id(inObjectId

oid, inCORBA::RepositoryId

intf)

raises(WrongPolicy);//對(duì)象標(biāo)識(shí)映射操作

ObjectIdservant_to_id(inServantp_servant)

raises(ServantNotActive,WrongPolicy);Objectservant_to_reference(inServantp_servant)

raises(ServantNotActive,WrongPolicy);Servantreference_to_servant(inObjectreference)

raises(ObjectNotActive,WrongAdapter,WrongPolicy);

ObjectIdreference_to_id(inObjectreference)

raises(WrongAdapter,WrongPolicy);Servantid_to_servant(inObjectId

oid)

raises(ObjectNotActive,WrongPolicy);Objectid_to_reference(inObjectId

oid)

raises(ObjectNotActive,WrongPolicy);};POA接口為什么要有多個(gè)POA,如果只有一個(gè)的話,也不需要什么管理器了

POA層次一個(gè)服務(wù)程序進(jìn)程中可使用多個(gè)POA,不同POA以名字區(qū)分。這些POA的集合呈現(xiàn)一種層次結(jié)構(gòu),即每個(gè)POA都有一個(gè)父POA,所有POA都是根POA的后代。每個(gè)ORB在創(chuàng)建時(shí)都自動(dòng)帶有一個(gè)根POA,可根據(jù)需要從根POA創(chuàng)建其他子POA。POA層次為服務(wù)程序中的對(duì)象標(biāo)識(shí)提供了一個(gè)層次化的名字空間。通常每個(gè)伺服對(duì)象最多僅與一個(gè)POA相關(guān)聯(lián),POA“擁有(包括POA策略)”這些對(duì)象并負(fù)責(zé)刪除這些對(duì)象,當(dāng)POA被刪除時(shí)其中的所有對(duì)象以及子POA也將被刪除。服務(wù)程序

伺服對(duì)象管理器

伺服對(duì)象1

客戶請(qǐng)求

伺服對(duì)象2伺服對(duì)象3POAPOA根POA注冊(cè)的伺服對(duì)象管理器

活動(dòng)對(duì)象映射表對(duì)象標(biāo)識(shí)1對(duì)象標(biāo)識(shí)2對(duì)象標(biāo)識(shí)3

POA管理器POA管理器POA管理器(POAManager)是一個(gè)對(duì)象,它將一個(gè)或多個(gè)POA組織在一起,為其中的POA提供共同的操作,POA管理器的狀態(tài)代表了它所管理的所有POA的狀態(tài)。例如開(kāi)發(fā)人員可通過(guò)POA管理器提供的操作決定是否接收或丟棄POA的請(qǐng)求,也可利用POA管理器終止POA。服務(wù)程序

伺服對(duì)象管理器

伺服對(duì)象1

客戶請(qǐng)求

伺服對(duì)象2伺服對(duì)象3POAPOA根POA注冊(cè)的伺服對(duì)象管理器

活動(dòng)對(duì)象映射表對(duì)象標(biāo)識(shí)1對(duì)象標(biāo)識(shí)2對(duì)象標(biāo)識(shí)3

POA管理器活動(dòng)對(duì)象映射表每一個(gè)POA中都有一個(gè)活動(dòng)對(duì)象映射表(ActiveObjectMap),表中保存了活動(dòng)對(duì)象的對(duì)象標(biāo)識(shí)及與之關(guān)聯(lián)的伺服對(duì)象,其作用是將活動(dòng)對(duì)象通過(guò)對(duì)象標(biāo)識(shí)映射到伺服對(duì)象。在一個(gè)特定的POA中,對(duì)象標(biāo)識(shí)唯一地標(biāo)識(shí)了一個(gè)CORBA對(duì)象。為將伺服對(duì)象轉(zhuǎn)換為一個(gè)可供遠(yuǎn)程調(diào)用的CORBA對(duì)象,必須建立CORBA對(duì)象與伺服對(duì)象之間的關(guān)聯(lián)。此外,POA還允許單個(gè)伺服對(duì)象(即缺省伺服對(duì)象)同時(shí)與多個(gè)CORBA對(duì)象相關(guān)聯(lián),這種特性對(duì)開(kāi)發(fā)大規(guī)模應(yīng)用意義重大。服務(wù)程序

伺服對(duì)象管理器

伺服對(duì)象1

客戶請(qǐng)求

伺服對(duì)象2伺服對(duì)象3POAPOA根POA注冊(cè)的伺服對(duì)象管理器

活動(dòng)對(duì)象映射表對(duì)象標(biāo)識(shí)1對(duì)象標(biāo)識(shí)2對(duì)象標(biāo)識(shí)3

POA管理器伺服對(duì)象管理器伺服對(duì)象管理器(servantmanager)是程序員自己提供的代碼,用于取代POA活動(dòng)對(duì)象映射表的功能。如果應(yīng)用程序需要以一種更復(fù)雜的方案將對(duì)象標(biāo)識(shí)映射到伺服對(duì)象,這時(shí)開(kāi)發(fā)人員可設(shè)計(jì)專(zhuān)用的伺服對(duì)象管理器。伺服對(duì)象管理器負(fù)責(zé)決定一個(gè)CORBA對(duì)象是否存在,然后查找伺服對(duì)象并將伺服對(duì)象指派給CORBA對(duì)象。為滿足不同的應(yīng)用需要,開(kāi)發(fā)人員可設(shè)計(jì)多個(gè)伺服對(duì)象管理器。有兩類(lèi)伺服對(duì)象管理器可供選擇:伺服對(duì)象激活器和伺服對(duì)象定位器,開(kāi)發(fā)人員可利用POA策略決定選用哪一種類(lèi)型。

服務(wù)程序

伺服對(duì)象管理器

伺服對(duì)象1

客戶請(qǐng)求

伺服對(duì)象2伺服對(duì)象3POAPOA根POA注冊(cè)的伺服對(duì)象管理器

活動(dòng)對(duì)象映射表對(duì)象標(biāo)識(shí)1對(duì)象標(biāo)識(shí)2對(duì)象標(biāo)識(shí)3

POA管理器附錄1-END什么是POA策略?POA策略是一個(gè)對(duì)象,負(fù)責(zé)控制相關(guān)POA的行為及這些POA所管理的對(duì)象,使用POA前應(yīng)仔細(xì)考慮應(yīng)用程序所需的策略集。POA策略可為不同的應(yīng)用程序設(shè)計(jì)目標(biāo)而配置不同的POA。目前CORBA規(guī)范定義了7種標(biāo)準(zhǔn)的POA策略,不同的ORB產(chǎn)品從可伸縮性或可靠性等因素考慮引入一些新的POA策略。附錄2選用POA策略

選用POA策略時(shí)應(yīng)注意某些策略值之間存在依賴(lài)關(guān)系(選用了一種,隱含的選用另一種)。

線程策略該策略指定POA使用的線程模型,它有兩種取值:ORB_CTRL_MODEL(缺省值):表示由ORB負(fù)責(zé)將對(duì)POA的請(qǐng)求指派到線程。在多線程環(huán)境中,并發(fā)請(qǐng)求可以用多線程傳送。SINGLE_THREAD_MODEL:這時(shí)只有一個(gè)線程,POA順序地處理請(qǐng)求。選用POA策略生命期策略該策略指定POA中對(duì)象實(shí)現(xiàn)的使用期限,它可有以下值:TRANSIENT(缺省值):由POA創(chuàng)建的對(duì)象引用是瞬時(shí)的,這些對(duì)象在創(chuàng)建它的POA之外不可存在。一旦POA被凍結(jié)為非活動(dòng)狀態(tài),調(diào)用該P(yáng)OA創(chuàng)建的任何對(duì)象引用將引發(fā)OBJECT_NOT_EXIST異常。對(duì)話型對(duì)象通常設(shè)計(jì)為瞬時(shí)對(duì)象。PERSISTENT:由POA創(chuàng)建的持久對(duì)象可在創(chuàng)建它的POA之外存在,因而使用這一策略通常還會(huì)同時(shí)采用USER_ID策略。對(duì)持久對(duì)象的請(qǐng)求可能導(dǎo)致隱式地激活一個(gè)進(jìn)程、一個(gè)POA以及實(shí)現(xiàn)該對(duì)象的伺服對(duì)象,這意味著POA應(yīng)注冊(cè)伺服對(duì)象定位器或激活器。實(shí)體型對(duì)象通常設(shè)計(jì)為持久對(duì)象。選用POA策略對(duì)象標(biāo)識(shí)唯一性策略該策略允許多個(gè)抽象對(duì)象共享一個(gè)伺服對(duì)象,它可取下列值:UNIQUE_ID(缺省值):被激活的伺服對(duì)象僅支持一個(gè)對(duì)象標(biāo)識(shí),POA不允許一個(gè)伺服對(duì)象與多個(gè)CORBA對(duì)象相關(guān)聯(lián)。MULTIPLE_ID:被激活的伺服對(duì)象可以有一個(gè)或多個(gè)對(duì)象標(biāo)識(shí),在運(yùn)行時(shí)刻調(diào)用伺服對(duì)象的操作時(shí)必須由操作內(nèi)部決定對(duì)象標(biāo)識(shí)。應(yīng)指出的是,對(duì)象標(biāo)識(shí)在特定的POA中總是唯一的,對(duì)象標(biāo)識(shí)唯一性策略指的是對(duì)象標(biāo)識(shí)與伺服對(duì)象之間關(guān)聯(lián)的唯一性或多重性。

選用POA策略對(duì)象標(biāo)識(shí)指派策略該策略指定對(duì)象標(biāo)識(shí)是由程序員編寫(xiě)的服務(wù)程序生成還是由POA自動(dòng)生成,它可取以下值:USER_ID:由應(yīng)用程序?yàn)镻OA的對(duì)象引用指定對(duì)象標(biāo)識(shí)。SYSTEM_ID(缺省值):由POA為它的對(duì)象引用分配對(duì)象標(biāo)識(shí)。如果同時(shí)還采用了PERSISTENT策略,則在同一POA的所有實(shí)例中對(duì)象標(biāo)識(shí)必須是唯一的。典型情況將是USER_ID策略用于持久對(duì)象,將SYSTEM_ID策略用于瞬時(shí)對(duì)象。如果想將SYSTEM_ID策略用于持久對(duì)象,可從伺服對(duì)象或?qū)ο笠弥刑崛?duì)象標(biāo)識(shí)。

選用POA策略伺服對(duì)象保持策略該策略指定POA是否將活動(dòng)伺服對(duì)象保存在活動(dòng)對(duì)象映射表中,它有兩種取值:RETAIN(缺省值):POA利用活動(dòng)對(duì)象映射表跟蹤對(duì)象的激活情況,通常與伺服對(duì)象激活器或POA顯式激活方式結(jié)合使用。NON_RETAIN:POA不在活動(dòng)對(duì)象映射表中保存活動(dòng)的伺服對(duì)象,通常結(jié)合伺服對(duì)象定位器一起使用。該策略決定POA是否利用活動(dòng)對(duì)象映射表跟蹤對(duì)象標(biāo)識(shí)與伺服對(duì)象之間的關(guān)聯(lián)。如果選擇NON_RETAIN策略則意味著不使用活動(dòng)對(duì)象映射表,因而使用該策略的應(yīng)用程序必須提供一個(gè)伺服對(duì)象定位器類(lèi)型的伺服對(duì)象管理器。

選用POA策略請(qǐng)求處理策略該策略指定POA如何處理請(qǐng)求,它有三種取值:USE_ACTIVE_OBJECT_MAP_ONLY(缺省值):POA僅依賴(lài)于活動(dòng)對(duì)象映射表決定哪些對(duì)象標(biāo)識(shí)可用及對(duì)象標(biāo)識(shí)關(guān)聯(lián)到哪些伺服對(duì)象。如果在活動(dòng)對(duì)象映射表中找不到對(duì)象標(biāo)識(shí),則引發(fā)OBJECT_NOT_EXIST異常。該值必須結(jié)合RETAIN策略使用。USE_DEFAULT_SERVANT:如果POA在活動(dòng)對(duì)象映射表中找不到對(duì)象標(biāo)識(shí),或已設(shè)置NON_RETAIN策略,則將請(qǐng)求分派給一個(gè)缺省伺服對(duì)象。缺省伺服對(duì)象必須先注冊(cè),如果未注冊(cè)則引發(fā)OBJ_ADAPTER異常。該值必須結(jié)合MULTIPLE_ID策略使用。USE_SERVANT_MANAGER:如果POA在活動(dòng)對(duì)象映射表中找不到對(duì)象標(biāo)識(shí),或已設(shè)置了NON_RETAIN策略,則POA使用一個(gè)伺服對(duì)象管理器激活或定位伺服對(duì)象。選用POA策略隱式激活策略該策略指定POA是否支持伺服對(duì)象的隱式激活,它可取以下值:IMPLICIT_ACTIVATION:POA支持隱式激活,服務(wù)程序可調(diào)用servant_to_reference操作或servant_to_id操作將伺服對(duì)象添加到活動(dòng)對(duì)象映射表并轉(zhuǎn)換為對(duì)象引用,也可調(diào)用伺服對(duì)象的_this方法激活伺服對(duì)象。該值要求同時(shí)使用SYSTEM_ID和RETAIN策略。NO_IMPLICIT_ACTIVATION(缺省值):POA不支持伺服對(duì)象的隱式激活,只有通過(guò)顯式的調(diào)用才可將伺服對(duì)象與一個(gè)對(duì)象標(biāo)識(shí)相關(guān)聯(lián)。POA管理器與適配器激活器接口POA管理器與適配器激活器接口

//POA管理器接口

interfacePOAManager{exceptionAdapterInactive{};

enumState{HOLDING,ACTIVE,DISCARDING,INACTIVE};voidactivate()

raises(AdapterInactive);voidhold_requests(in

booleanwait_for_completion)

raises(AdapterInactive);voiddiscard_requests(in

booleanwait_for_completion)

raises(AdapterInactive);voiddeactivate(in

booleanetherealize_objects, inbooleanwait_for_completion)

raises(AdapterInactive);Stateget_state();};

//適配器激活器接口

interfaceAdapterActivator{

booleanunknown_adapter(inPOAparent,instringname);};附錄2-END5.3使用POA調(diào)用ORB偽對(duì)象的resolve_initial_references()操作獲取根POA的對(duì)象引用利用根POA提供的操作定義應(yīng)用程序所需的POA策略集用自定義POA策略集在根POA下創(chuàng)建一個(gè)子POA甚至一個(gè)完整的POA層次創(chuàng)建或激活對(duì)象引用激活POA管理器,通常整個(gè)服務(wù)程序只需使用一個(gè)POA管理器使用POApublicclassServer{publicstaticvoidmain(String[]args){try{

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

POArootPOA=POAHelper.narrow(

orb.resolve_initial_references("RootPOA"));

org.omg.CORBA.Policy[]policies={

rootPOA.create_lifespan_policy(

LifespanPolicyValue.PERSISTENT)};POAmyPOA=rootPOA.create_POA("BankPOA",

rootPOA.the_POAManager(),policies);

AccountManagerImpl

managerServant= newAccountManagerImpl();

myPOA.activate_object_with_id("BankManager".getBytes(),managerServant);

rootPOA.the_POAManager().activate();

System.out.println("帳戶管理員BankManager已就緒...\n");orb.run();}catch(Exceptionexc){

exc.printStackTrace();}}}服務(wù)程序Server.java調(diào)用ORB偽對(duì)象的resolve_initial_references操作獲取根POA的引用調(diào)用根POA的操作定義應(yīng)用程序所需的POA策略用自定義策略在根POA下創(chuàng)建一個(gè)子POA-myPOA,甚至創(chuàng)建一個(gè)完整的POA層次;創(chuàng)建并激活伺服對(duì)象激活POA管理器,等待處理客戶程序的請(qǐng)求初始化ORB并取根POA的引用初始化ORB作用:獲取ORB偽對(duì)象的引用,以備調(diào)用ORB內(nèi)核提供的操作時(shí)使用獲取根POA的對(duì)象引用所有CORBA服務(wù)程序必須獲取根POA的對(duì)象引用根POA既可直接管理對(duì)象,也可創(chuàng)建不同策略集的子POA有一個(gè)預(yù)定義的策略集,由于僅當(dāng)創(chuàng)建POA時(shí)才可設(shè)置POA的策略集,而不可更改已有的策略集,因此根POA的策略集不可更改//解析”RootPOA”為一個(gè)通用對(duì)象Org.omg.CORBA.Object

obj=orb.resolve_initial_references(“RootPOA”);//將通用對(duì)象類(lèi)型窄化為POA類(lèi)型POArootPOA=POAHelper.narrow(obj);服務(wù)程序

伺服對(duì)象管理器

伺服對(duì)象1

客戶請(qǐng)求

伺服對(duì)象2伺服對(duì)象3POAPOA根POA注冊(cè)的伺服對(duì)象管理器

活動(dòng)對(duì)象映射表對(duì)象標(biāo)識(shí)1對(duì)象標(biāo)識(shí)2對(duì)象標(biāo)識(shí)3

POA管理器創(chuàng)建自定義策略的POA創(chuàng)建一個(gè)新的子POA的主要目的是為了獲取不同的POA行為,例如使用持久對(duì)象或使用伺服對(duì)象管理器等注:POA層次結(jié)構(gòu)并不意味著POA策略也具有相應(yīng)的層次結(jié)構(gòu),子POA并不繼承其父POA的任何策略利用create_POA()方法可以創(chuàng)建一個(gè)新的POA作為該P(yáng)OA的子POA,可以根據(jù)實(shí)際需要以這種方式創(chuàng)建多個(gè)子POA,從而形成一個(gè)POA層次org.omg.CORBA.Policy[]policies={

rootPOA.create_lifespan_policy(LifesPERSISTENT)};POAmyPOA=rootPOA.create_POA(“ABC”,rootPOA.the_POAManager(),policies);服務(wù)程序創(chuàng)建子POA只需提供子POA的名字,客戶程序必須使用完整的POA名字指定一個(gè)子POA一個(gè)完整的POA名字記錄了該子POA名字在內(nèi)的整個(gè)層次路徑,層次之間用”/”分割,如“/A/B/C”,”/”表示根POA使用POA管理器控制新POA的狀態(tài)大多應(yīng)用中,服務(wù)程序的所有POA均使用同一個(gè)POA管理器(多對(duì)一)POA管理器生存期的四種狀態(tài):持有,活動(dòng),非活動(dòng),丟棄;這些狀態(tài)也代表了其所控制的所有POA的工作狀態(tài)附錄3使用POA管理器

持有狀態(tài)create_POA非活動(dòng)狀態(tài)丟棄狀態(tài)活動(dòng)狀態(tài)activatehold_requestsdeactivatedestroydeactivateactivatediscard_requestshold_requestsdiscard_requestsdeactivatePOA管理器的狀態(tài)以及引起狀態(tài)轉(zhuǎn)換的操作如下面狀態(tài)轉(zhuǎn)換圖所示。使用POA管理器活動(dòng)狀態(tài)當(dāng)POA管理器處于活動(dòng)狀態(tài)時(shí),由它控制的所有POA將接收并開(kāi)始處理請(qǐng)求。調(diào)用POA管理器的activate操作可將POA管理器從持有或丟棄狀態(tài)改為活動(dòng)狀態(tài)。voidactivate()raises(AdapterInactive);注意即使在活動(dòng)狀態(tài)下,由于ORB實(shí)現(xiàn)或系統(tǒng)資源限制等原因,POA也可能需要將來(lái)不及處理的請(qǐng)求排隊(duì)。每一個(gè)ORB產(chǎn)品都會(huì)限制請(qǐng)求隊(duì)列的最大長(zhǎng)度,超過(guò)該限制時(shí)POA會(huì)返回一個(gè)TRANSIENT異常給客戶程序。

持有狀態(tài)create_POA非活動(dòng)狀態(tài)丟棄狀態(tài)活動(dòng)狀態(tài)activatehold_requestsdeactivatedestroydeactivateactivatediscard_re

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論