版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026上半年貴州事業(yè)單位聯(lián)考余慶縣招聘74人筆試備考試題及答案解析
- 2026年曲靖市師宗縣事業(yè)單位遴選工作人員(24人)筆試備考題庫(kù)及答案解析
- 2026浙江省財(cái)務(wù)開(kāi)發(fā)有限責(zé)任公司招聘筆試備考試題及答案解析
- 2026重慶飛駛特人力資源管理有限公司外派至AIGC項(xiàng)目招聘考試備考試題及答案解析
- 廣安市廣安區(qū)廣福街道辦事處2026年選用1名片區(qū)紀(jì)檢監(jiān)督員筆試模擬試題及答案解析
- 2026年二胡教學(xué)揉弦技巧訓(xùn)練
- 2026河南鄭州中原純化制程實(shí)驗(yàn)室招聘5人考試備考題庫(kù)及答案解析
- 2026年環(huán)境監(jiān)測(cè)數(shù)據(jù)分析培訓(xùn)
- 2025年教師人事編制考試及答案
- 2025年大理三中事業(yè)單位考試及答案
- 公路成本管理培訓(xùn)
- 2026云南昆明市公共交通有限責(zé)任公司總部職能部門(mén)員工遴選48人筆試模擬試題及答案解析
- 2025至2030中國(guó)數(shù)字經(jīng)濟(jì)產(chǎn)業(yè)發(fā)展現(xiàn)狀及未來(lái)趨勢(shì)分析報(bào)告
- 導(dǎo)管室護(hù)理新技術(shù)
- 2026湖北隨州農(nóng)商銀行科技研發(fā)中心第二批人員招聘9人筆試模擬試題及答案解析
- 2025年-輔導(dǎo)員素質(zhì)能力大賽筆試題庫(kù)及答案
- 2026屆湖北省宜昌市部分示范高中教學(xué)協(xié)作體數(shù)學(xué)高一上期末教學(xué)質(zhì)量檢測(cè)試題含解析
- 2025年風(fēng)電運(yùn)維成本降低路徑報(bào)告
- 2026年《必背60題》 計(jì)算機(jī)科學(xué)與技術(shù)26屆考研復(fù)試高頻面試題包含詳細(xì)解答
- 2026年初中奧數(shù)試卷真題及答案
- 江蘇省教改課題申報(bào)書(shū)
評(píng)論
0/150
提交評(píng)論