版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、可移植對(duì)象適配器11.2 簡(jiǎn)介 POA技術(shù)提供地最基本地服務(wù)是:對(duì)象創(chuàng)建、伺服程序注冊(cè)以及請(qǐng)求地調(diào)調(diào)度。POA提供了一整套特性和服務(wù),可以利用它來(lái)編寫可擴(kuò)縮的、高性能的服務(wù)器應(yīng)用程序,它在合理控制資源請(qǐng)求方面起著重要的作用。11.3 POA基本原理 在一個(gè)服務(wù)器應(yīng)用程序中,POA負(fù)責(zé)創(chuàng)建對(duì)象、激活對(duì)象以及將對(duì)各個(gè)對(duì)象的請(qǐng)求調(diào)度到它們各自的伺服程序上,通過(guò)POA,CORBA對(duì)象完成了編程語(yǔ)言所提供的伺服程序的相互對(duì)應(yīng)關(guān)系。 當(dāng)一個(gè)對(duì)象處于激活狀態(tài)時(shí),該對(duì)象就可以接收并執(zhí)行請(qǐng)求。當(dāng)對(duì)象得到一個(gè)請(qǐng)求后,該對(duì)象必須由伺服程序進(jìn)行具體化,或給它以具體形式。一個(gè)給定對(duì)象僅由一個(gè)單個(gè)的伺服程序在給定點(diǎn)及時(shí)進(jìn)
2、行具體化,但超時(shí)以后,可以創(chuàng)建許多伺服程序?qū)嵗齺?lái)具體化一個(gè)CORBA對(duì)象。最后每一個(gè)伺服程序釋放后就結(jié)束了它與相對(duì)應(yīng)的CORBA對(duì)象之間的連接。 具體化和釋放是應(yīng)用于伺服程序的,創(chuàng)建和撤消是應(yīng)用于CORBA對(duì)象的。111.3.1 基本的請(qǐng)求調(diào)度基本調(diào)度如下: (1) 首先,服務(wù)器應(yīng)用程序以某種方式為CORBA對(duì)象到處一個(gè)對(duì)象引用??蛻魴C(jī)可能通過(guò)命名服務(wù)或者交易服務(wù)或者從另一個(gè)請(qǐng)求接收它來(lái)獲得到處對(duì)象引用。對(duì)象引用從邏輯上“指向”目標(biāo)CORBA對(duì)象,像C+指針指向它底層的C+對(duì)象一樣。 (2) 其次,在應(yīng)用程序的控制下,客戶程序ORB使用對(duì)象引用來(lái)決定對(duì)象駐留在何處和如何訪問(wèn)它,然后它向服務(wù)器O
3、RB發(fā)送請(qǐng)求。 (3) 再次,服務(wù)器ORB接收請(qǐng)求并將其調(diào)度給擁有該目標(biāo)對(duì)象的POA。 (4) 最后,POA通過(guò)調(diào)用具體化該目標(biāo)對(duì)象的伺服程序來(lái)繼續(xù)執(zhí)行該調(diào)度。211.3.2 關(guān)鍵的POA實(shí)體有三種關(guān)鍵實(shí)體涉及到POA 對(duì)象引用 POA負(fù)責(zé)創(chuàng)建對(duì)象引用。 對(duì)象標(biāo)識(shí)符 在POA主機(jī)的作用域內(nèi),每一個(gè)對(duì)象通過(guò)調(diào)用一個(gè)octet序列的對(duì)象標(biāo)識(shí)符進(jìn)行識(shí)別。當(dāng)POA創(chuàng)建一個(gè)新的CORBA對(duì)象時(shí),典型情況是,它就將對(duì)象標(biāo)識(shí)符嵌入在對(duì)象引用的對(duì)象密鑰部分。 伺服程序 引用程序直接通過(guò)POA可以創(chuàng)建并注冊(cè)伺服程序來(lái)具體化對(duì)象。同樣,應(yīng)用程序可以向POA提供伺服程序管理器對(duì)象,當(dāng)需要執(zhí)行一個(gè)請(qǐng)求時(shí),POA就能創(chuàng)
4、建伺服程序。應(yīng)用程序甚至可以提供一個(gè)默認(rèn)的伺服程序。與POA策略有關(guān),在任何給定的時(shí)間,單個(gè)的伺服程序可以用POA注冊(cè)來(lái)具體化一個(gè)和多個(gè)的CORBA對(duì)象。 POA通過(guò)目標(biāo)對(duì)象的對(duì)象標(biāo)識(shí)符與合適的伺服程序之間的映射來(lái)調(diào)度請(qǐng)求。一個(gè)伺服程序也可以通過(guò)對(duì)一個(gè)伺服程序的_this調(diào)用隱式創(chuàng)建一個(gè)新的CORBA對(duì)象,并為其注冊(cè)一個(gè)伺服程序。311.4 POA策略POA規(guī)范的關(guān)鍵特性就是一個(gè)應(yīng)用程序可以包含多個(gè)POA實(shí)例。每一個(gè)POA實(shí)例代表具有相似性能的一組對(duì)象。這些性能通過(guò)POA創(chuàng)建時(shí)所指定的POA策略來(lái)控制。所有應(yīng)用程序至少有一個(gè)POA,也就是Root POA,它具有標(biāo)準(zhǔn)的策略集。策略是用來(lái)定義PO
5、A性能的對(duì)象,該對(duì)象在策略內(nèi)部創(chuàng)建。向POA和POAManager接口一樣,CORBA規(guī)范指出,在標(biāo)準(zhǔn)的PortableServer模塊中定義POA策略接口。像所有的策略接口一樣,POA策略類從CORBA:Policy接口派生出來(lái)。Policy接口及相關(guān)的類型提供的管理操作 (1) 通過(guò)基本的Policy接口,利用policy_type只讀屬性可以確定策略的實(shí)際派生類型。 PolicyType是由OMG控制的一個(gè)標(biāo)志值,這樣可以確保所有的標(biāo)準(zhǔn)接口都有一個(gè)唯一的標(biāo)志 (2) copy操作可以克隆(clone) 一個(gè)Policy對(duì)象。返回的引用指向目標(biāo)Policy對(duì)象的一個(gè)全新的拷貝。4POA策略
6、(3) destory操作用來(lái)撤消目標(biāo)Policy對(duì)象。(4) PoicyList用來(lái)將指向各種派生Policy對(duì)象的引用分組來(lái)形成策略集。POA創(chuàng)建操作接收一個(gè)PolicyList類型的參數(shù),這個(gè)參數(shù)可以將策略設(shè)置成新的POA。策略對(duì)象是局部約束對(duì)象。也就是任何試圖將它們的引用作為參數(shù)傳遞給標(biāo)準(zhǔn)的CORBA操作或通過(guò)ORB:object_to_string將它們轉(zhuǎn)換成字符串的操作都將產(chǎn)生CORBA:MARCHAL異常。511.4.1 CORBA對(duì)象生存期范圍假如一個(gè)客戶程序向一個(gè)當(dāng)前沒(méi)有運(yùn)行或沒(méi)有激活的目標(biāo)對(duì)象發(fā)出一個(gè)請(qǐng)求,如果必要的話,ORB工具就會(huì)為該對(duì)象激活一個(gè)服務(wù)器進(jìn)程,然后激活對(duì)象
7、本身。服務(wù)器進(jìn)程和目標(biāo)對(duì)象的任何激活對(duì)發(fā)出請(qǐng)求的客戶來(lái)說(shuō)都是透明的。持久對(duì)象:生存期超過(guò)創(chuàng)建或激活它們的某一特定進(jìn)程的CORBA對(duì)象。除了持久對(duì)象外,其它的對(duì)象的生命周期由進(jìn)程的生命周期甚至于創(chuàng)建它們的對(duì)象適配器來(lái)決定。611.4.2 對(duì)象標(biāo)識(shí)符POA通過(guò)它的對(duì)象標(biāo)識(shí)符識(shí)別每一個(gè)對(duì)象。對(duì)象標(biāo)識(shí)符被賦值為ObjectId類型,這個(gè)類型在PortableServer模塊中定義為octet的一個(gè)序列。一個(gè)程序可以顯示的提供自己的對(duì)象標(biāo)識(shí)符,也可以讓POA為它創(chuàng)建對(duì)象標(biāo)識(shí)符。對(duì)象標(biāo)識(shí)符和對(duì)象引用的主要區(qū)別是在命名一個(gè)對(duì)象的POA作用域外,對(duì)象標(biāo)識(shí)符是無(wú)意義的。在單個(gè)POA的作用域內(nèi),所有對(duì)象標(biāo)識(shí)符必須
8、是唯一的。如果使用具有SYSTEM_ID策略值的POA,POA就會(huì)自動(dòng)生成唯一的ID。如果使用具有USER_ID策略值的POA,POA就會(huì)通過(guò)產(chǎn)生異常來(lái)防止兩個(gè)相同的ID。對(duì)象標(biāo)識(shí)符由IdAssignmentPolicy來(lái)控制711.4.3 對(duì)象到伺服程序之間的映射一個(gè)只有少量幾個(gè)暫態(tài)對(duì)象的應(yīng)用程序在開(kāi)始監(jiān)聽(tīng)請(qǐng)求前,可能會(huì)為每個(gè)對(duì)象創(chuàng)建各自的伺服程序并使用POA注冊(cè)它們。擁有多個(gè)持久CORBA對(duì)象的應(yīng)用程序可能只需要一個(gè)伺服程序來(lái)具體化所有的這些對(duì)象。對(duì)象標(biāo)識(shí)符映射到用UNIQUE_ID策略值創(chuàng)建的POA中的下伺服程序。 當(dāng)調(diào)用一個(gè)請(qǐng)求時(shí),POA先提取出ObjectId,通常ObjectId嵌
9、入在目標(biāo)對(duì)象的對(duì)象引用中,然后使用該ObjectId在激活的對(duì)象映射中查找目標(biāo)對(duì)象的伺服程序。在激活的對(duì)象映射中的每一個(gè)條目由一個(gè)ObjectId和一個(gè)指向一個(gè)伺服程序的指針的關(guān)聯(lián)組成。保留ObjectId對(duì)伺服程序關(guān)聯(lián)的每一個(gè)POA都有它自己的激活的對(duì)象映射。對(duì)于UNIQUE_ID,POA實(shí)現(xiàn)的規(guī)則是每一個(gè)對(duì)象標(biāo)識(shí)符映射到一個(gè)不同的伺服程序。而在一個(gè)MULTIPLE_ID中,多個(gè)對(duì)象標(biāo)識(shí)符可以映射到一個(gè)伺服程序。 對(duì)于Root POA,標(biāo)準(zhǔn)的對(duì)象標(biāo)識(shí)符的唯一策略值是 UNIQUE_ID。Root POA要求一個(gè)獨(dú)立的伺服程序來(lái)具體化每一個(gè)對(duì)象。811.4.4 策略工廠操作 通過(guò)調(diào)用POA的策
10、略工廠操作可以創(chuàng)建策略。POA接口為每個(gè)類型都提供了一個(gè)獨(dú)立的策略工廠操作。每一個(gè)策略工廠操作都一同樣的方式工作:向新的策略對(duì)象傳遞所需的值,然后操作返回對(duì)象引用。最終,必須調(diào)用返回對(duì)象中的destroy操作來(lái)撤銷它。911.5 POA創(chuàng)建為了讓POA策略有效,在創(chuàng)建時(shí)就將它們應(yīng)用于POA。通過(guò)調(diào)用另一個(gè)POA的create_POA可以創(chuàng)建一個(gè)POA。因?yàn)樗械姆?wù)器應(yīng)用程序都有一個(gè)Root POA,所以它的create_POA操作起到了創(chuàng)建其它POA的起始點(diǎn)的作用。使用另一個(gè)POA創(chuàng)建的POA就成了正在創(chuàng)建的POA的子POA。但是,這對(duì)子POA的策略沒(méi)有影響,策略并不繼承符父POA。相反,如
11、果沒(méi)有策略值傳遞給create_POA操作,則使用默認(rèn)值。在IDL定義時(shí)需要注意: POAManager允許應(yīng)用程序控制一個(gè)POA中的請(qǐng)求流。 create_POA操作有三個(gè)參數(shù)。POA的名稱、指向?yàn)橐獎(jiǎng)?chuàng)建的POA控制請(qǐng)求流的POAManager的一個(gè)引用,為空將創(chuàng)建一個(gè)新的、創(chuàng)建POA策略列表。 create_POA 操作可能會(huì)產(chǎn)生兩個(gè)異常。同名AdapterAlreadyExists異常。策略未知或不一致InvalidPolicy10POA創(chuàng)建POA策略的創(chuàng)建: CORBA:PolicyList policy_list PortableServer:POA_var child_poa=ro
12、ot_poa-create_POA(“child”,PortableServer:POAManager:_nil(), policy_list) (1) 先初始化ORB和從Root POA獲得一個(gè)引用的一般調(diào)用序列 (2) 創(chuàng)建一個(gè)CORBA:PolicyList序列,默認(rèn)為空 (3) 調(diào)用Root POA的create_POA,傳遞字符串“child”作為新的POA的名字,同時(shí)傳遞的參數(shù)還有一個(gè)空的POAManager引用和空的策略列表。 也可以創(chuàng)建一分層的POA。例如: PortableServer:POA_var poa_A=root_poa-create_POA(“A”,) Porta
13、bleServer:POA_var poa_B=poa_A-create_POA(“B”,) PortableServer:POA_var poa_C=poa_B-create_POA(“C”,)1111.6 Server IDL類型native類型 native類型的目的是允許IDL標(biāo)識(shí)符可以被說(shuō)明為沒(méi)有IDL定義的一種類型,但是這種類型可由每種語(yǔ)言映射來(lái)單獨(dú)進(jìn)行定義。 在C+中,Servant類型映射到一個(gè)指向ServantBase類的指針。 ServantBase可視為所有框架的基類,也就是所有應(yīng)用程序伺服類的基類。 ServantBase提供_default_POA函數(shù), _defau
14、lt_POA函數(shù)的ServantBase實(shí)現(xiàn)返回一個(gè)指向Root POA的引用。當(dāng)調(diào)用一個(gè)伺服程序的_this函數(shù)來(lái)隱式創(chuàng)建并激活一個(gè)新的暫態(tài)CORBA時(shí), _default_POA提供POA引用。1211.7 對(duì)象創(chuàng)建和激活11.7.1 對(duì)象創(chuàng)建 POA提供兩種不用創(chuàng)建伺服程序就可以創(chuàng)建CORBA對(duì)象的操作。 create_refernce和create_refernce_with_id都需要一個(gè)RepositoryId參數(shù)來(lái)識(shí)別新對(duì)象支持的大多數(shù)派生的IDL接口。 create_refernce操作要求POA具有一個(gè)值為SYSTEM_ID的IdAssignmentPolicy值,以便POA
15、為新的對(duì)象生成ObjectId。如果沒(méi)有,將會(huì)引發(fā)WrongPolicy異常。使用create_refernce_with_id時(shí),應(yīng)用程序提供Object_Id。這個(gè)Object_Id在應(yīng)用程序域內(nèi)表示對(duì)象的身份。 Object create_refernce(in CORBA:RepositoryId intf) raises(WrongPolicy); Object create_refernce_with_id(in ObjectId oid, CORBA:RepositoryId intf) raises(WrongPolicy);13對(duì)象創(chuàng)建和激活11.7.2 伺服程序注冊(cè) 激活一
16、個(gè)對(duì)象的最簡(jiǎn)單方法之一就是使用POA對(duì)象激活操作。使用這些操作,應(yīng)用程序開(kāi)發(fā)人員顯式提供一個(gè)伺服程序來(lái)具體化將被激活的對(duì)象,并且根據(jù)POA的IdAssignmentPolicy,POA賦值一個(gè)ObjectId或應(yīng)用程序開(kāi)發(fā)人員提供一個(gè)ObjectId。 根據(jù)目標(biāo)POA的策略,選擇使用active_object或activate_object_with_id。 active_object操作要求目標(biāo)POA具有值為SYSTEM_ID的一個(gè)IdAssignmentPolicy和值為RETAIN的一個(gè)ServerRetentionPolicy值。 activate_object_with_id操作要求
17、目標(biāo)POA具有RETAIN的一個(gè)ServerRetentionPolicy值。 如果POA的IdUniquenessPolicy設(shè)置為UNIQUE_ID并且為一個(gè)參數(shù)傳遞Servant已經(jīng)存在于POA的激活對(duì)象映射中,它們倆都將引發(fā)ServantAlreadyActive異常。14對(duì)象創(chuàng)建和激活11.7.3 伺服程序管理器 具有USE_SERVANT_MANAGER策略的POA允許它們創(chuàng)建伺服程序來(lái)支持這些類型的應(yīng)用程序,這些伺服程序參與確定對(duì)象對(duì)伺服程序關(guān)聯(lián)的過(guò)程。 伺服程序管理器有兩種類型。 (1) 對(duì)于ServantRetention策略值是RETAIN的POA,伺服程序管理器對(duì)象必須支
18、持ServantActivator接口。 (2) 對(duì)于策略值是NON_RETAIN的POA,伺服程序管理器必須支持ServantLocator接口。 伺服程序激活器(Servant Activators) ServantActivator接口提供incarnate和etherealize操作 incarnate操作用來(lái)實(shí)現(xiàn)或是創(chuàng)建一個(gè)伺服程序的一個(gè)合適的實(shí)例并返回它,或者產(chǎn)生一個(gè)異常。 etherealize函數(shù)的功能剛好與incarnate函數(shù)相反。它允許應(yīng)用程序清除它們的伺服程序。 15對(duì)象創(chuàng)建和激活伺服程序定位器(Servant Locators) 對(duì)于使用USE_SERVANT_MAN
19、AGER和NON_ RETAIN策略的POA,伺服程序管理器必須支持ServantLoactor接口。此接口提供了preinvoke和postinvoke操作。 preinvoke函數(shù)用來(lái)獲得一個(gè)要調(diào)度給請(qǐng)求的伺服程序。在請(qǐng)求返回后,POA調(diào)用postinvoke來(lái)讓ServantLocator執(zhí)行伺服程序清除或其后調(diào)用函數(shù)。直到POA涉及之前,由postinvoke返回的伺服程序只用于單個(gè)的請(qǐng)求。伺服程序管理器注冊(cè) 因?yàn)樗欧绦虮旧硎荂ORBA對(duì)象,所以需要通過(guò)POA用它們的對(duì)象引用來(lái)注冊(cè)它們,為伺服程序管理器創(chuàng)建一個(gè)對(duì)象引用的最容易的方法是隱式在Root POA注冊(cè)它的伺服程序。 Port
20、ableServer:ServantManage_var mgr_ref=manager_impl._this(); poa-set-servant_manager(mgr_ref);16對(duì)象創(chuàng)建和激活11.7.4 默認(rèn)的伺服程序 POA的RequestProcessingPolicy之為USE_DEFAULT_SERVANT時(shí),就表示使用默認(rèn)的伺服程序。 ProtableServer:Current接口 在一個(gè)請(qǐng)求調(diào)度的過(guò)程中,服務(wù)器ORB可以讓一個(gè)應(yīng)用程序獲得目標(biāo)對(duì)象的ObjectId和正在調(diào)度請(qǐng)求的POA的一個(gè)引用。這些操作由ProtableServer:Current接口提供。 get
21、_POA函數(shù)用來(lái)獲得一個(gè)引用 get_object_id函數(shù)用來(lái)獲得目標(biāo)對(duì)象的ObjectId1711.8 引用、ObjectId和伺服程序servant_to_id操作返回與目標(biāo)伺服程序關(guān)聯(lián)的ObjectId。servant_to_reference操作返回伺服程序正在進(jìn)行具體化的對(duì)象的對(duì)象引用。reference_to_servant操作返回指向?qū)ο笠盟呋膶?duì)象的伺服程序。reference_to_id操作在傳遞給它的對(duì)象引用參數(shù)中返回對(duì)象IDid_to_reference操作為由對(duì)象ID參數(shù)代表的對(duì)象返回一個(gè)對(duì)象引用。id_to_servant操作返回與確定的對(duì)象ID相關(guān)聯(lián)的伺服程序
22、。1811.9 對(duì)象失效最終,所有的CORBA對(duì)象必須失效。因?yàn)榧せ钜粋€(gè)CORBA對(duì)象需要設(shè)置一個(gè)對(duì)象對(duì)伺服程序的關(guān)聯(lián),所以為了使一個(gè)對(duì)象失效,就需要中斷這種對(duì)象與伺服程序的關(guān)聯(lián)。通過(guò)調(diào)用擁有該對(duì)象的POA上的deactivate_object就可以達(dá)到這個(gè)目的。在調(diào)用這個(gè)函數(shù)時(shí),要將對(duì)象的ObjectId作為唯一的參數(shù)進(jìn)行傳遞。一旦沒(méi)有對(duì)該ObjectId其它的有效請(qǐng)求,最終POA會(huì)在它的激活對(duì)象映射中刪除ObjectId與伺服程序的關(guān)聯(lián)。1911.10 請(qǐng)求流控制資源管理的另一個(gè)方面與一個(gè)服務(wù)器程序可以處理的應(yīng)用程序的請(qǐng)求率有關(guān)。每一個(gè)POA具有一個(gè)相關(guān)的POAManager,從本質(zhì)上說(shuō)P
23、OAManager起到一個(gè)讓你控制對(duì)POA的請(qǐng)求流的水龍頭或閥門的作用。POAManager接口提供的四周操作與POAManager對(duì)象的四種狀態(tài)相對(duì)應(yīng)。 (1) 可以調(diào)用activate操作來(lái)讓目標(biāo)POAManager轉(zhuǎn)換到active狀態(tài)并且讓請(qǐng)求流通向POA或它所控制的POA。(2) 可以調(diào)用hold_reauests操作來(lái)將目標(biāo)POAManager的狀態(tài)改變到holding狀態(tài)。在這種狀態(tài)下, POAManager將所有向POA或向它控制下的POA所做的請(qǐng)求進(jìn)行排隊(duì)。(3) 可以調(diào)用discard_request操作來(lái)將目標(biāo)POAManager的狀態(tài)改變?yōu)閐iscarding狀態(tài),在這
24、種狀態(tài)下, POAManager將每個(gè)進(jìn)入的請(qǐng)求丟棄,不排隊(duì)并且不將它傳送給目標(biāo)POA;相反,他會(huì)將CORBA:TRANSIENT異常返回給客戶。(4) 可以調(diào)用deactivate操作將目標(biāo)POAManager的狀態(tài)改為inactive狀態(tài)。在這種狀態(tài)下的POAManager不再處理請(qǐng)求并且不能被重新激活。2011.11 ORB事件處理任何一個(gè)作為服務(wù)器程序的CORBA應(yīng)用程序必須接收并處理事件,比如來(lái)自客戶要求的連接和它們的后繼的請(qǐng)求。就事件處理而論,服務(wù)器引用程序可以分為兩類。 (1) 在一些應(yīng)用程序中,只有ORB需要接收并處理這樣的事件。這些應(yīng)用程序可以僅將控制主線程交給ORB,這樣它
25、就可以處理請(qǐng)求并調(diào)度它們給對(duì)象適配器和伺服程序。這樣的應(yīng)用程序可以說(shuō)是執(zhí)行blocking事件處理,因?yàn)閼?yīng)用程序main將被阻阻塞,直到ORB關(guān)閉它的事件處理并將控制返回給main。 (2) 在另一些應(yīng)用程序中,ORB只是必須執(zhí)行事件處理的幾種組件中的一個(gè)。比如,一個(gè)具有圖形用戶接口(GUI)的CORBA應(yīng)用程序除了讓ORB處理輸入的請(qǐng)求外,還必須讓GUI處理窗口事件。所以這些類型的應(yīng)用程序執(zhí)行non_blocking事件處理。它們將控制主線程交給各種事件處理子系統(tǒng)的每一個(gè),而不允許它們中的任何一個(gè)阻塞有效的事件周期。 就像POAManager對(duì)象允許你控制POA的請(qǐng)求流一樣,ORB提供各種操
26、作允許你控制整個(gè)應(yīng)用程序的請(qǐng)求流和事件處理,也包含所有的對(duì)象適配器。21ORB事件處理11.11.1 阻塞事件處理 ORB:run操作將阻塞,直到ORB停止運(yùn)行。從執(zhí)行你的應(yīng)用程序main的線程中調(diào)用run,可以讓ORB接管主線程來(lái)執(zhí)行它的工作。ORB保持對(duì)主線程的控制,并且在調(diào)用ORB:shutdown和ORB完全停止運(yùn)行后才返回。從任何其它線程中調(diào)用run,只能等到ORB停止后,才可以阻塞那個(gè)線程。11.11.2 非阻塞事件處理 當(dāng)ORB接管主線程時(shí),ORB:run操作可以讓應(yīng)用程序運(yùn)行。但是對(duì)于其它事件循環(huán)共享主線程的應(yīng)用程序,將主線長(zhǎng)的控制交給ORB是不可接收的。11.11.3 應(yīng)用程
27、序停止運(yùn)行 當(dāng)你想關(guān)閉應(yīng)用程序時(shí),調(diào)用ORB:shutdown。他只含有唯一的boolean參數(shù),這個(gè)參數(shù)告訴應(yīng)用程序阻塞是否要等待所有關(guān)閉的活動(dòng)結(jié)束才進(jìn)行或者在所有關(guān)閉的工作完成前它就返回。22ORB事件處理服務(wù)器應(yīng)用程序通常有三種方式關(guān)閉 (1) 應(yīng)用程序可以使用一種超時(shí)的方法。 (2) 用戶可以通過(guò)向正在運(yùn)行的應(yīng)用程序發(fā)送一個(gè)信號(hào)來(lái)強(qiáng)制執(zhí)行關(guān)閉。 (3) 另一種方法可能是調(diào)用由應(yīng)用程序CORBA對(duì)象提供的一些shutdown操作。2311.12 POA激活像伺服程序一樣,POA可以按要求創(chuàng)建,這種方法用于很少調(diào)用POA的對(duì)象的應(yīng)用程序。當(dāng)接到一個(gè)向還沒(méi)有創(chuàng)建的子代POA真的對(duì)象所做的請(qǐng)求
28、時(shí)或應(yīng)用程序使用一個(gè)已經(jīng)命名但還沒(méi)有創(chuàng)建的POA的POA:find_POA操作來(lái)搜索POA的層次結(jié)構(gòu)時(shí),POA就會(huì)激活應(yīng)用程序必須通過(guò)激活它的子代POA的每個(gè)POA來(lái)注冊(cè)一個(gè)AdapterActivator。適配器激活器是一個(gè)普通的CORBA對(duì)象,所以它們可以通過(guò)伺服程序來(lái)具體化。一個(gè)適配器激活將的C+伺服程序從POA_PortableServer:AdapterActivator框架中派生出來(lái)。在此伺服類中唯一的有意義的成員函數(shù)是unknown_adapter函數(shù)。他包含一個(gè)指向?qū)⒈患せ畹腜OA的父POA的引用以及新的POA名字。2411.13 POA析構(gòu)最終,POA必須被撤消,通常是由于O
29、RB的關(guān)閉和服務(wù)器應(yīng)用程序進(jìn)程的結(jié)束。但是在應(yīng)用程序關(guān)閉時(shí)并沒(méi)有撤消。例如,一個(gè)打算保持運(yùn)行的應(yīng)用程序可能追蹤一個(gè)給定POA擁有的所有對(duì)象,然后在它以前所創(chuàng)建的所有對(duì)象都撤消后,撤消該P(yáng)OA。使用POA:destory操作可以撤消POA。2511.14 應(yīng)用POA策略在應(yīng)用程序中的POA數(shù)量以及為每個(gè)POA選擇的策略與幾個(gè)因素有關(guān)。其中的一些因素如下: (1) 你的應(yīng)用程序打算支持的對(duì)象的數(shù)量 (2) 請(qǐng)求的期望率和持續(xù)時(shí)間 (3) 你的對(duì)象所需要的潛在的持久存儲(chǔ) (4) 應(yīng)用程序所運(yùn)行的計(jì)算機(jī)和操作系統(tǒng)提供的資源和服務(wù)水平 (5) 應(yīng)用程序必須包括的或者是有相互影響的任何非CORBA軟件 (
30、6) 應(yīng)用程序運(yùn)行的部分域的一些特征,尤其是將對(duì)象重新定位在域中其它服務(wù)器上的能力是否理想26應(yīng)用POA策略11.4.1 多線程問(wèn)題 應(yīng)用程序必須做出的基本的選擇是它們是單線程還是多線程。這個(gè)選擇依賴于下面的幾個(gè)細(xì)節(jié):(1) 所使用的操作系統(tǒng)或C+語(yǔ)言運(yùn)行時(shí)是否提供足夠的多線程支持(2) 你的ORB實(shí)現(xiàn)對(duì)線程的要求(3) 調(diào)試多線程應(yīng)用程序所使用的工具(4) 你的創(chuàng)建和維護(hù)多線程應(yīng)用程序的專業(yè)知識(shí)和經(jīng)驗(yàn)水平(5) 在你的應(yīng)用程序中使用的任何第三方庫(kù)在對(duì)線程環(huán)境下正確工作的能力。27應(yīng)用POA策略11.14.2 ObjectId賦值 決定一個(gè)POA的值為USER_ID還是SYSTEM_ID的Id
31、AssignmentPolocy的一個(gè)簡(jiǎn)單規(guī)則為:為暫態(tài)對(duì)象使用系統(tǒng)賦值的對(duì)象標(biāo)識(shí)符,而對(duì)持久對(duì)象使用用戶賦值的標(biāo)識(shí)符。典型情況是使用值為UESR_ID的IdAssignmentPolocy,同時(shí)使用值為PERSISTENT的LifespanPolicy,因?yàn)閯?chuàng)建對(duì)象的ObjectId通常包含一些你在何處存儲(chǔ)對(duì)象創(chuàng)建狀態(tài)的指示。如果應(yīng)用程序使用文件系統(tǒng)路徑名或數(shù)據(jù)庫(kù)的鍵值作為持久對(duì)象的ObjectIds。對(duì)于暫態(tài)對(duì)象,將POA賦值為ObjectIds是最簡(jiǎn)單的方法,因?yàn)橥ǔD愕膽?yīng)用程序并不直接使用生成的標(biāo)識(shí)符。11.14.3 激活 只能將USER_ID和PERSISTENT一塊使用;將IMPL
32、ICIT_ACTIVATION和SYSTEM_ID一起使用。 建議: 支持ServantRetentionPolicy值為 RETAIN,IdAssignmentPolicy的值為 SYSTEM_ID,IDUniquenessPolicy的值為NIQUE_ID,LifespanPolicy的值為TRANSIENT的POA使用IMPLICIT_ACTIVATION。這是因?yàn)閷?duì)一個(gè)伺服程序使用_this函數(shù)來(lái)隱式創(chuàng)建并激活暫態(tài)對(duì)象可非常方便地創(chuàng)建Policy對(duì)象,伺服程序管理器,迭代器以及其它暫態(tài)對(duì)象,對(duì)擁有持久對(duì)象的POA使用默認(rèn)的NO_IMPLICITACTIVATION。28應(yīng)用POA策略1
33、1.14.4 時(shí)空折衷 POA請(qǐng)求需要時(shí)間和空間有兩個(gè)主要方面: (1) POA定位域目錄對(duì)象ObjectId相關(guān)聯(lián)的一個(gè)伺服程序需要時(shí)間和空間資源。這主要包括在激活對(duì)象映射中的查找,調(diào)用一個(gè)伺服程序管理器所需要的時(shí)間和確定是否使用一個(gè)默認(rèn)伺服程序所需的時(shí)間。 (2) 伺服程序確定對(duì)一個(gè)給定的請(qǐng)求應(yīng)具體化哪一個(gè)對(duì)象需要的時(shí)間和空間。11.14.5 關(guān)于生命范圍的考慮 面向服務(wù)的應(yīng)用程序通常具有兩個(gè)特征:(1) 它們由長(zhǎng)命的對(duì)象組成,這些長(zhǎng)命的對(duì)象通過(guò)管理工具創(chuàng)建和撤消。(2) 它們對(duì)象的狀態(tài)完全存儲(chǔ)在持久存儲(chǔ)中。29應(yīng)用POA策略面向會(huì)話的應(yīng)用程序 面向會(huì)話的應(yīng)用程序:客戶創(chuàng)建它們打算使用的對(duì)
34、象,使用這些對(duì)象,然后撤消它們。 與面向服務(wù)器的應(yīng)用程序相比,它擁有的大多數(shù)對(duì)象是通過(guò)對(duì)象工廠中的請(qǐng)求創(chuàng)建的。通常這個(gè)工廠本身是面向服務(wù)的持久對(duì)象并且在命名服務(wù)和交易服務(wù)中公告??蛻羰紫仁褂眠@些服務(wù)來(lái)尋找必須的工廠,然后,它們想改工廠做出請(qǐng)求以創(chuàng)建它們需要的會(huì)話對(duì)象。它是一個(gè)暫態(tài)的。持久對(duì)象 即使擁有它們的服務(wù)器應(yīng)用程序當(dāng)前并不在執(zhí)行并且必須啟動(dòng),但支持持久的CORBA對(duì)象的一個(gè)ORB實(shí)現(xiàn)必須能夠定位他們并將請(qǐng)求傳遞給它們。這也就隱式說(shuō)明擁有持久對(duì)象的應(yīng)用程序不能孤立的操作。相反,這樣的服務(wù)器撤消必須使用ORB實(shí)現(xiàn)倉(cāng)庫(kù)進(jìn)行注冊(cè)以讓ORB來(lái)跟蹤它們擁有的對(duì)象并且當(dāng)請(qǐng)求調(diào)用這些對(duì)象時(shí)能夠激活它們。
35、30應(yīng)用POA策略暫態(tài)對(duì)象 與持久對(duì)象不同,暫態(tài)對(duì)象不需要對(duì)定位和激活有效的支持。這樣持久它們就非常適合于處理短期的或局部的活動(dòng)。 策略值不是TRANSIENT的POA還有幾種有意義的用途,他不同于Root POA。(1)因?yàn)镽oot POA的ThreadPolicy的值為ORB_CTRL_MODEL,所以一個(gè)應(yīng)用程序想讓它的暫態(tài)對(duì)象所做的所有請(qǐng)求順序調(diào)度的話,需要一個(gè)具有SINGLE_THREADMODEL值的POA。(2)一個(gè)應(yīng)用程序可以要求一個(gè)擁有暫態(tài)對(duì)象的POA,它的IdAssignmentPolicy值為USE_ID而不是Root POA所具有的SYSTEM_ID。(3) 它可以用于策略值
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國(guó)汽車后行業(yè)經(jīng)營(yíng)策略及未來(lái)發(fā)展規(guī)劃分析報(bào)告
- 2024-2030年中國(guó)汽包漆項(xiàng)目可行性研究報(bào)告
- 2024-2030年中國(guó)桔霉素境外融資報(bào)告
- 2024-2030年中國(guó)月子中心行業(yè)市場(chǎng)運(yùn)行現(xiàn)狀及投資發(fā)展前景預(yù)測(cè)報(bào)告
- 普通高中第二學(xué)期政教處工作計(jì)劃
- 2024-2030年中國(guó)無(wú)熱再生干燥器項(xiàng)目可行性研究報(bào)告
- 員工招聘管理制度及工作流程
- 工廠生產(chǎn)線設(shè)備供貨安裝及技術(shù)支持方案
- 博物館外立面玻璃更換方案
- 金融行業(yè)年度客戶服務(wù)工作總結(jié)
- 2023-2024學(xué)年廣東省廣州市白云區(qū)九年級(jí)(上)期末語(yǔ)文試卷
- 2024統(tǒng)編版初中八年級(jí)語(yǔ)文上冊(cè)第六單元:大單元整體教學(xué)設(shè)計(jì)
- 五年級(jí)上冊(cè)數(shù)學(xué)試題試卷(8篇)
- 2024-2025學(xué)年四年級(jí)科學(xué)上冊(cè)第三單元《運(yùn)動(dòng)和力》測(cè)試卷(教科版)
- 學(xué)術(shù)規(guī)范與論文寫作智慧樹(shù)知到答案2024年浙江工業(yè)大學(xué)
- 2024年典型事故案例警示教育手冊(cè)15例
- 2023年希望杯數(shù)學(xué)培訓(xùn)100題-二年級(jí)(含答案)
- EN1779-歐洲無(wú)損檢測(cè)標(biāo)準(zhǔn)
- 【數(shù)據(jù)結(jié)構(gòu)】A類停車場(chǎng)管理系統(tǒng)
- 生態(tài)保護(hù)紅線劃定.ppt
- 機(jī)械原理榫槽成型半自動(dòng)切削機(jī)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論