版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、ICE系列培訓(xùn)(三)鮑齊權(quán)統(tǒng)一網(wǎng)管平臺(tái)專(zhuān)項(xiàng)培訓(xùn)內(nèi)容1. ICE運(yùn)行時(shí)2. 動(dòng)態(tài)ICE3. 連接管理4. Freeze Map1.1 概述本章主要介紹ICE運(yùn)行時(shí)的一些內(nèi)部細(xì)節(jié):通信器ICE上下文對(duì)象適配器連接超時(shí)對(duì)象標(biāo)識(shí)單向、數(shù)據(jù)報(bào)、批量調(diào)用Current對(duì)象定位服務(wù)Servant自動(dòng)重試ICE線程模型字符串編碼代理插件開(kāi)發(fā)1. ICE運(yùn)行時(shí)1.2 通信器通信器Ice:Communicator是Ice運(yùn)行時(shí)的主入口點(diǎn),其實(shí)例與一些運(yùn)行時(shí)資源關(guān)聯(lián)在一起:客戶端線程池對(duì)象適配器服務(wù)端線程池配置屬性對(duì)象工廠日志記錄器統(tǒng)計(jì)對(duì)象缺省路由器缺省定位器插件管理器1. ICE運(yùn)行時(shí)1.2 通信器注意:不同通信
2、器的對(duì)象適配器以及ICE對(duì)象是相互獨(dú)立的;不同通信器使用其自己的線程池,互不干擾;通常情況下,一個(gè)服務(wù)器中使用一個(gè)通信器即可;某些情況下多通信器更有用:例如,IceBox對(duì)每個(gè)Ice服務(wù)使用不同的通信器這樣保證不同服務(wù)間互不干擾;1. ICE運(yùn)行時(shí)1.2 通信器通信器接口:module Icelocal interface Communicatorstring proxyToString(Object *obj);Object *stringToProxy(string str);通信器提供大量接口來(lái)操作它所關(guān)聯(lián)的運(yùn)行時(shí)資源,后面介紹各個(gè)資源時(shí)再介紹。1. ICE運(yùn)行時(shí)1.3 通信器的初始化在
3、創(chuàng)建通信器時(shí),ICE運(yùn)行時(shí)初始化了一系列通信器特性,這些特性影響通信器的行為;注意:這些特性生命期隨通信器生命期一起,通信器創(chuàng)建后就不能更改了。因此,你必須在創(chuàng)建通信器時(shí)設(shè)置好這些特性; 初始化使用Ice:initialize函數(shù):namespace Ice CommunicatorPtr initialize(int&, char*, const InitializationData& = InitializationData(), Int = ICE_INT_VERSION); CommunicatorPtr initialize(StringSeq&, const
4、 InitializationData& = InitializationData(), Int = ICE_INT_VERSION); CommunicatorPtr initialize(const InitializationData& = InitializationData() Int = ICE_INT_VERSION); 1. ICE運(yùn)行時(shí)1.3 通信器的初始化通信器創(chuàng)建時(shí)可以定制下列特性: 屬性集合屬性集合 日志接口日志接口 狀態(tài)接口狀態(tài)接口 寬寬/ /窄字符集轉(zhuǎn)換器窄字符集轉(zhuǎn)換器 線程通知線程通知hookhook 分派器分派器 類(lèi)裝載器(僅類(lèi)裝載器(僅java
5、java) 1. ICE運(yùn)行時(shí)1.3 通信器的初始化要建立這些特性,你需要填充一個(gè)InitializationData結(jié)構(gòu): namespace Ice struct InitializationData PropertiesPtr properties; LoggerPtr logger;StatsPtr stats;StringConverterPtr stringConverter;WstringConverterPtr wstringConverter;ThreadNotificationPtr threadHook; DispatcherPtr dispatcher; ; ; 1.
6、ICE運(yùn)行時(shí)示例:運(yùn)行時(shí)屬性集可從文件中讀取InitializationData initData;initDperties = createProperties();initDperties-load(configFile);1.3 通信器的初始化例如:定制一個(gè)類(lèi)型為MyLogger的日志記錄器 Ice:InitializationData id;id.logger = new MyLoggerI; Ice:CommunicatorPtr ic = Ice:initialize(argc, argv, id);1. ICE運(yùn)行時(shí)例如,我們的總線客戶端的通信器是在下
7、面所示函數(shù)內(nèi)初始化的:void CBusClientForRpcClient:ClientInit(const string &strUnmBusRegistryServerAddress, const string &strClientName)Ice:InitializationData initData;m_poVar-m_poRpcCommunicator = Ice:initialize(initData);1.4 對(duì)象適配器對(duì)象適配器是位于Ice運(yùn)行時(shí)和實(shí)際服務(wù)提供對(duì)象(Servant)之間,實(shí)現(xiàn)以下職責(zé):(1)將Ice對(duì)象(培訓(xùn)一中有介紹什么是Ice對(duì)象和Serv
8、ant)映射到Servant,并分派請(qǐng)求給Servant;(2)輔助Ice對(duì)象和Servant的生命期操作;(3)提供傳輸端點(diǎn);注意:每個(gè)通信器可擁有一個(gè)或多個(gè)對(duì)象適配器;每個(gè)對(duì)象適配器可擁有一個(gè)或多個(gè)Servant;每個(gè)對(duì)象適配器可擁有多個(gè)傳輸端點(diǎn),這些傳輸端點(diǎn)代表的是通向同一組對(duì)象的不同路徑;每個(gè)對(duì)象適配器可非強(qiáng)制性擁有自己的線程池(通過(guò).ThreadPool.Size設(shè)置)如果設(shè)置了適配器自己的線程池,那么給對(duì)象適配器的分配操作將使用自己線程池中的線程,而不會(huì)使用通信器中的線程池。1. ICE運(yùn)行時(shí)1.4.1 活動(dòng)Servant映射表每個(gè)對(duì)象適配器都維護(hù)有一個(gè)活動(dòng)Servant映射表(A
9、SM)。對(duì)于收到的客戶端請(qǐng)求,對(duì)適配器會(huì)根據(jù)對(duì)象標(biāo)識(shí)到ASM中查找正確的Servant來(lái)分派這個(gè)請(qǐng)求。注意:如果客戶端請(qǐng)求包含的對(duì)象標(biāo)識(shí)無(wú)法在ASM中找到正確的Servant,則適配器會(huì)返回ObjectNotExistException異常給客戶端(適配器沒(méi)有使用Servant定位器時(shí))1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器1.4.2 ServantsServant是位于服務(wù)端,為客戶端提供實(shí)際服務(wù)業(yè)務(wù)的Ice對(duì)象實(shí)例,它使用具體語(yǔ)言實(shí)現(xiàn)Ice接口。注意:同一Servant可注冊(cè)給多個(gè)對(duì)象適配器;Ice:ObjectAdapterPtr adapter = communicator()-crea
10、teObjectAdapter(Hello);/ ServantDemo:HelloPtr hello = new HelloI; adapter-add(hello, communicator()-stringToIdentity(hello);adapter-activate();1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器HelloI實(shí)現(xiàn)的接口Slice定義:module Demo interface Hello idempotent void sayHello(int delay); void shutdown(); ;接口實(shí)現(xiàn):class HelloI : public Demo:Hello
11、;1.4.3 對(duì)象適配器的創(chuàng)建及提供的接口對(duì)象適配器的創(chuàng)建:使用通信器提供的方法::Ice:ObjectAdapterPtr createObjectAdapter(const :std:string&);:Ice:ObjectAdapterPtr createObjectAdapterWithEndpoints(const :std:string&, const :std:string&);:Ice:ObjectAdapterPtr createObjectAdapterWithRouter(const :std:string&, const :Ice:Rou
12、terPrx&);對(duì)象適配器提供了大量本地接口可用來(lái)訪問(wèn)適配器:module Ice local interface ObjectAdapter string getName(); Communicator getCommunicator(); / . ; ; 1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器示例: Ice:ObjectAdapterPtr adapter = ic-createObjectAdapterWithEndpoints( SimplePrinterAdapter, default -p 10000);1.4.4 Servant的激活與解除激活Servant激活:告知Ic
13、e運(yùn)行時(shí)某個(gè)Servant的存在(加入ASM)。解除激活:將Servant從ASM中移除。對(duì)象適配器提供了add函數(shù)來(lái)激活和解除Servant:Object *add(Object servant, Identity id);Object *addWithUUID(Object servant);void remove(Identity id);1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器1.4.4 Servant的激活與解除激活注意:不允許使用同一標(biāo)識(shí)激活多次;不同標(biāo)識(shí)可用來(lái)激活同一Servant多次,這種情況下同一Servant將表現(xiàn)為多個(gè)Ice對(duì)象;addWithUUID會(huì)自動(dòng)為Servant生
14、成一個(gè)UUID作為對(duì)象標(biāo)識(shí)。Demo:HelloPtr hello = new HelloI; / Servant adapter-add(hello, communicator()-stringToIdentity(hello);1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器1.4.5 對(duì)象適配器狀態(tài)對(duì)象適配器具有三種狀態(tài):保持狀態(tài)(holding);活動(dòng)狀態(tài)(active);不活動(dòng)狀態(tài)(inactive)。1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器1.4.5 對(duì)象適配器狀態(tài)保持狀態(tài)(holding)處于保持狀態(tài)的適配器,任何到來(lái)的請(qǐng)求客戶端都會(huì)收到TimeoutException或ConnectTimeo
15、utException異常。注意:出于保持狀態(tài)下面向流協(xié)議的適配器(TCP/IP),服務(wù)端運(yùn)行時(shí)會(huì)停止從相應(yīng)的傳輸端點(diǎn)讀數(shù)據(jù),同時(shí)也會(huì)拒絕客戶端的連接請(qǐng)求。對(duì)象適配器提供的操作:void Ice:ObjectAdapter:hold();該操作或?qū)⑦m配器置為hold狀態(tài),但是不會(huì)等待已有請(qǐng)求的完成,會(huì)立即返回。void Ice:ObjectAdapter:waitForHold();該操作會(huì)阻塞調(diào)用線程,知道所有已有請(qǐng)求完成。1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器1.4.5 對(duì)象適配器狀態(tài)活動(dòng)狀態(tài)(active)活動(dòng)狀態(tài)下的適配器可以接收并分派請(qǐng)求到servant注意:新創(chuàng)建的適配器初始化狀態(tài)是
16、Holding狀態(tài);雙向連接的適配器不需要激活(雙向連接參見(jiàn)1.7);并置調(diào)用(collocated invocation)即使適配器沒(méi)有激活調(diào)用也會(huì)成功,除非你禁用了并置調(diào)用優(yōu)化。對(duì)象適配器提供的操作: void Ice:ObjectAdapter:activate();激活對(duì)象適配器,例如:Ice:ObjectAdapterPtr adapter = communicator()-createObjectAdapter(Hello); Demo:HelloPtr hello = new HelloI; / Servant adapter-add(hello, communicator()-
17、stringToIdentity(hello); adapter-activate(); / 激活適配器1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器1.4.5 對(duì)象適配器狀態(tài)不活動(dòng)狀態(tài)( inactive )不活動(dòng)狀態(tài)下,適配器在概念上已經(jīng)被銷(xiāo)毀了。一旦適配器處于不活動(dòng)狀態(tài),那么它將不能再被重新激活對(duì)象適配器提供的操作: void Ice:ObjectAdapter:deactivate(); void Ice:ObjectAdapter:waitForDeactivate(); void Ice:ObjectAdapter:isDeactivated(); void Ice:ObjectAdapte
18、r:destroy();1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器1.4.6 Endpoints(端點(diǎn))Endpoints:由:傳輸協(xié)議、主機(jī)名、端口組成;格式:protocal h host addr1 p port No.: protocal h host addr2 p port No.一個(gè)對(duì)象適配器維護(hù)有兩組傳輸端點(diǎn):一組用于對(duì)象適配器監(jiān)聽(tīng)新的連接物理傳輸端點(diǎn);一組嵌入適配器創(chuàng)建的代理對(duì)象中,用于客戶端通信使用(發(fā)布端點(diǎn))published endpoints; (大多數(shù)情況下,這兩組端點(diǎn)是一樣的,但它們是可以獨(dú)立配置的)1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器1.4.6 En
19、dpoints(端點(diǎn))物理端點(diǎn)(Physical Endpoints )物理傳輸端點(diǎn)是對(duì)象適配器用來(lái)接收客戶端請(qǐng)求用的; 可由:name.Endpoints屬性或createObjectAdapterWithEndpoints方法進(jìn)行設(shè)定;例如:Hello.Endpoints=tcp -p 10000:udp -p 10000:ssl -p 10001注意:(1)如果端點(diǎn)中定義了主機(jī)名,那么對(duì)象適配器只能監(jiān)聽(tīng)該網(wǎng)絡(luò)接口上的請(qǐng)求;(2)如果端點(diǎn)中未定義主機(jī)名,但是屬性Ice.Default.Host定義了,那么對(duì)象適配器將監(jiān)聽(tīng)I(yíng)ce.Default.Host定義的主機(jī)名的端點(diǎn);(3)如果上面兩者
20、都未定義,那么對(duì)象適配器將監(jiān)聽(tīng)所有網(wǎng)絡(luò)接口;1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器1.4.6 Endpoints(端點(diǎn))注意:(4)如果要強(qiáng)制對(duì)象適配器監(jiān)聽(tīng)所有網(wǎng)絡(luò)接口,則可定義端點(diǎn)中的主機(jī)名為或*;(5)如果端點(diǎn)中指定了主機(jī)名,但是沒(méi)有指定回環(huán)接口,那么回環(huán)接口是不會(huì)被監(jiān)聽(tīng)的,必須加入后才能監(jiān)聽(tīng)回環(huán)接口:MyAdapter.Endpoints=tcp h p 9999:tcp h p 9999(6)如果端點(diǎn)中沒(méi)有指定端口,則對(duì)象適配器會(huì)使用系統(tǒng)選擇的一個(gè)端口進(jìn)行監(jiān)聽(tīng)(該端口不固定);1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.4
21、 對(duì)象適配器1.4.6 Endpoints(端點(diǎn))發(fā)布端點(diǎn)(Published Endpoints ) 對(duì)象適配器創(chuàng)建代理對(duì)象時(shí),需要發(fā)布它的傳輸端點(diǎn),但是它不能發(fā)布它的物理傳輸端點(diǎn);例如,一個(gè)服務(wù)運(yùn)行在防火墻后的私有網(wǎng)絡(luò)內(nèi),它的適配器的物理端點(diǎn)使用的是私有網(wǎng)絡(luò)的地址,如果將物理端點(diǎn)發(fā)布在對(duì)象適配器創(chuàng)建的代理中,那么公共網(wǎng)絡(luò)中的客戶端是無(wú)法使用的。 這種情況下適配器必須在它的代理中發(fā)布能夠指引客戶端通過(guò)防火墻的端點(diǎn)。 使用name.PublishedEndpoints配置發(fā)布端點(diǎn); 如果未配置上述屬性,則適配器會(huì)使用物理端點(diǎn)(注意:除非只有回環(huán)接口,否則回環(huán)接口不會(huì)被發(fā)布)例如: MyAdap
22、ter.Endpoints=tcp h p 9999 MyAdapter.PublishedEndpoints=tcp h corpfw p 25000 表示連接在主機(jī)名為corpfw端口25000的客戶端會(huì)被轉(zhuǎn)發(fā)到適配器的物理端點(diǎn)上(私有網(wǎng)絡(luò)上的端點(diǎn))。1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器1.4.6 Endpoints(端點(diǎn))發(fā)布端點(diǎn)還可用于多服務(wù)負(fù)載平衡時(shí): 假設(shè)有兩個(gè)狀態(tài)無(wú)關(guān)的服務(wù)運(yùn)行在兩個(gè)不同的主機(jī)上以實(shí)現(xiàn)負(fù)載平衡。一般情況下客戶端使用的代理對(duì)象的端點(diǎn)同時(shí)包含兩個(gè)服務(wù)的端點(diǎn),這樣Ice運(yùn)行時(shí)可以隨機(jī)選擇一個(gè)服務(wù)建立連接。 但是,如果客戶端調(diào)用了服務(wù)的
23、某操作后,該操作返回了一個(gè)該服務(wù)的代理對(duì)象。那么,客戶端使用這個(gè)返回代理對(duì)象調(diào)用操作時(shí)Ice運(yùn)行時(shí)會(huì)始終選擇返回該代理的服務(wù)端(因?yàn)榉祷氐拇碇兄挥袆?chuàng)建它的服務(wù)端端點(diǎn)),無(wú)法負(fù)載平衡。 這種情況下要負(fù)載平衡可以配置服務(wù)端適配器的發(fā)布端點(diǎn),讓發(fā)布端點(diǎn)同時(shí)包含兩服務(wù):(假設(shè)兩個(gè)服務(wù)一個(gè)叫sun1,一個(gè)叫sun2) 1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器對(duì)于sun1 MyAdapter.Endpoints=tcp h sun1 p 9999 MyAdapter.PublishedEndpoints=tcp h Sun1 p 9999:tcp h Sun2 p 9999對(duì)于sun2 M
24、yAdapter.Endpoints=tcp h sun2 p 9999 MyAdapter.PublishedEndpoints=tcp h Sun1 p 9999:tcp h Sun2 p 99991.4.6 Endpoints(端點(diǎn))刷新端點(diǎn) 主機(jī)的網(wǎng)絡(luò)接口列表可能會(huì)動(dòng)態(tài)改變。例如,筆記本電腦從一個(gè)無(wú)線網(wǎng)絡(luò)移動(dòng)到另外的無(wú)線網(wǎng)絡(luò)時(shí)。 這時(shí)對(duì)象適配器提供刷新網(wǎng)絡(luò)接口列表的方法: local interface ObjectAdapter void refreshPublishedEndpoints(); / ; 注意:刷新時(shí)機(jī)由應(yīng)用程序自己決定; 只有那些發(fā)布端點(diǎn)中沒(méi)有配置主機(jī)地址或配置的是
25、全部地址(*或)的對(duì)象適配器,該刷新才有效。1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器1.4.6 Endpoints(端點(diǎn))端點(diǎn)的超時(shí)屬性 作為防備惡意客戶端的手段,建議在物理端點(diǎn)中指定超時(shí)時(shí)間。 超時(shí)會(huì)影響那些Ice運(yùn)行時(shí)通常不希望長(zhǎng)時(shí)間阻塞的任務(wù):向socket寫(xiě)回應(yīng)消息或等待SSL磋商完成等。如果沒(méi)有設(shè)置超時(shí),那么運(yùn)行時(shí)會(huì)無(wú)限等待。這樣一些惡意客戶端就能夠大量消耗資源。端點(diǎn)中使用-t參數(shù)設(shè)置超時(shí)MyAdapter.Endpoints=tcp p 9999 t 50001. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器1.4.6 Endpoints(端點(diǎn))路由
26、器如果對(duì)象適配器配置了路由器,那么適配器的發(fā)布端點(diǎn)會(huì)影響路由器(詳見(jiàn)手冊(cè)42章關(guān)于如何使用路由器配置對(duì)象適配器)1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器1.4.7 創(chuàng)建代理 對(duì)象適配器接口提供多種方法創(chuàng)建代理對(duì)象(不管對(duì)象id表示的Servant是否是激活的): Object * ObjectAdapter:createProxy(Identity id);它返回直接代理還是間接代理由對(duì)象適配器的配置決定。如果對(duì)象適配器是用的適配器id,則返回間接代理;如果對(duì)象適配器沒(méi)有id,那么該接口使用適配器發(fā)布端點(diǎn)返回一個(gè)直接代理; Object * ObjectAdapter:creat
27、eDirectProxy(Identity id); 該接口直接返回一個(gè)直接代理,代理端點(diǎn)為適配器的發(fā)布端點(diǎn);Object * ObjectAdapter:createIndirectProxy(Identity id); 返回一個(gè)間接代理。直接代理其內(nèi)部保存有某個(gè)對(duì)象的標(biāo)識(shí),以及它的服務(wù)器的運(yùn)行地址;間接代理其內(nèi)部保存有某個(gè)對(duì)象的標(biāo)識(shí),以及對(duì)象適配器名(object adapter name)。1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器1.4.8 使用多對(duì)象適配器 一個(gè)典型的服務(wù)實(shí)現(xiàn)很少需要使用多個(gè)對(duì)象適配器。如果你正考慮使用多個(gè)對(duì)象適配器,則建議你考慮是否用到了下列情況:(1)
28、. 你需要一個(gè)細(xì)粒度的對(duì)象訪問(wèn)控制。例如,已可能有一個(gè)適配器僅綁定一個(gè)安全的端點(diǎn)來(lái)限制訪問(wèn)一些管理對(duì)象,其它的適配器綁定到非安全端點(diǎn)上用來(lái)訪問(wèn)其它對(duì)象;(2). 針對(duì)不同集合的對(duì)象,你需要控制線程池中線程數(shù)量。例如:某個(gè)特定的適配器上的對(duì)象不需要并發(fā)處理,而是設(shè)置多個(gè)適配器,每個(gè)適配器有各自的線程池,這樣可用于解決死鎖;(3). 你需要針對(duì)某一組對(duì)象能夠暫時(shí)禁用它上面的新請(qǐng)求。這可以通過(guò)設(shè)置相應(yīng)的對(duì)象適配器的狀態(tài)為Holding來(lái)完成;(4). 當(dāng)你在Glacier2中使用一個(gè)Ice路由器時(shí)能設(shè)置不同請(qǐng)求路徑時(shí)可以考慮使用多適配器; 如果你的應(yīng)用中沒(méi)有上述情形,則你無(wú)須使用多適配器; 1. I
29、CE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.4 對(duì)象適配器1.5 對(duì)象標(biāo)識(shí)(Object Identity)每一個(gè)Ice對(duì)象都有如下定義的一個(gè)對(duì)象標(biāo)識(shí):module Ice struct Identity string name; string category; ; ; 標(biāo)識(shí)可以用字符串標(biāo)示:category/name通信器成員函數(shù):string identityToString(Identity id);Identity stringToIdentity(string id);可用于相互轉(zhuǎn)換1. ICE運(yùn)行時(shí)示例:Demo:HelloPtr hello = new HelloI; / Servant/
30、 下面用“hello”字符串作為對(duì)象標(biāo)識(shí)adapter-add(hello, communicator()-stringToIdentity(hello);1.6 Ice:Current對(duì)象每個(gè)傳給服務(wù)端骨架操作的最后一個(gè)參數(shù)都是Ice:Current對(duì)象;module Ice local dictionary Context; enum OperationMode Normal, Nonmutating, Idempotent ; local struct Current ObjectAdapter adapter; 分派該操作的對(duì)象適配器Connection con; 接收該請(qǐng)求的連接信息
31、Identity id; 處理當(dāng)前請(qǐng)求的對(duì)象標(biāo)識(shí)string facet; (參見(jiàn)33章)string operation; 當(dāng)前調(diào)用的操作名OperationMode mode; 調(diào)用模式Context ctx; 當(dāng)前調(diào)用上下文(參見(jiàn)手冊(cè)32.12)int requestId; 請(qǐng)求ID用來(lái)關(guān)聯(lián)請(qǐng)求和請(qǐng)求回應(yīng); ; 1. ICE運(yùn)行時(shí)例如: virtual void sayHello(:Ice:Int, const :Ice:Current& = :Ice:Current() = 0;1.7 Servant定位器 Servant定位器是一個(gè)注冊(cè)到對(duì)象適配器的對(duì)象,當(dāng)?shù)絹?lái)的請(qǐng)求在ASM
32、中無(wú)法找到正確的Servant時(shí),會(huì)調(diào)用該定位器對(duì)象,由定位器對(duì)象返回一個(gè)正確的Servant來(lái)處理這個(gè)請(qǐng)求。沒(méi)有定位器時(shí):(1)每個(gè)Ice對(duì)象都由一個(gè)不同的Servant表示;(2)每個(gè)Ice對(duì)象對(duì)應(yīng)的Servant必須駐留在內(nèi)存中; 如果Servant的數(shù)量很多時(shí),會(huì)面臨內(nèi)存壓力問(wèn)題;使用Servant定位器:允許Servant實(shí)例數(shù)量小于Ice對(duì)象數(shù)量;運(yùn)行時(shí)由定位器根據(jù)需要實(shí)例化Servant。1. ICE運(yùn)行時(shí)1.7 Servant定位器 要實(shí)現(xiàn)定位器,你需要繼承自Ice:ServantLocator,并實(shí)locate,finished,deactivate方法。 如果到來(lái)的請(qǐng)求在A
33、SM中找不到Servant,則Ice運(yùn)行時(shí)會(huì)掉調(diào)用locate方法; locate返回一個(gè)Servant,Ice運(yùn)行時(shí)會(huì)將請(qǐng)求分派給該Servant,請(qǐng)求完成后,Ice運(yùn)行時(shí)會(huì)調(diào)finished; 定位器銷(xiāo)毀時(shí)deactivate會(huì)被調(diào)用。1. ICE運(yùn)行時(shí)1.7 Servant定位器定位器的線程保證:同步操作Ice運(yùn)行時(shí)保證,調(diào)用locate和finished是配對(duì)的且在同一線程內(nèi)的;異步分派的操作Ice運(yùn)行時(shí)不保證調(diào)用locate和finished是同一線程;如果在locate和finished中訪問(wèn)了共享數(shù)據(jù),則必須加以保護(hù)。1. ICE運(yùn)行時(shí)1.7 Servant定位器向?qū)ο筮m配器注冊(cè)
34、一個(gè)定位器:使用對(duì)象適配器方法void addServantLocator(ServantLocator locator, string category);進(jìn)行注冊(cè)。注意:必須提供category實(shí)參,它決定這個(gè)定位器要負(fù)責(zé)的Ice對(duì)象標(biāo)識(shí)(那些對(duì)象標(biāo)識(shí)與定位器category匹配的Ice對(duì)象才會(huì)觸發(fā)該定位器的locate調(diào)用)1. ICE運(yùn)行時(shí)1.8 缺省Servants還可以使用缺省Servants來(lái)解決Servants量很大的問(wèn)題。它根據(jù)請(qǐng)求對(duì)象標(biāo)識(shí)的不同改變其行為??赏ㄟ^(guò)對(duì)象適配器方法:void addDefaultServant(Object servant, string cat
35、egory);添加缺省Servant。注意:缺省Servant需要保護(hù)共享數(shù)據(jù)。1. ICE運(yùn)行時(shí)1.9 服務(wù)器實(shí)現(xiàn)技術(shù)1.9.1 漸進(jìn)初始化如果使用了Servant定位器,locate方法返回的Servant實(shí)例只能用于當(dāng)前請(qǐng)求(Ice運(yùn)行時(shí)不會(huì)將該Servant加入ASM)。所以,Servant的初始化是分散到每次請(qǐng)求調(diào)用中的,而不是服務(wù)啟動(dòng)時(shí)(也可以在locate首次實(shí)例化了某Servant后將其加入ASM,這樣后面的調(diào)用請(qǐng)求不再需要初始化該Servant了);內(nèi)存需求也有所降低,因?yàn)橹挥心切┍辉L問(wèn)到的Servant才會(huì)被實(shí)例化。1. ICE運(yùn)行時(shí)1.9 服務(wù)端實(shí)現(xiàn)技術(shù)1.9.2 缺省S
36、ervants針對(duì)不同的請(qǐng)求,缺省Servant能充當(dāng)不同角色。根據(jù)訪問(wèn)對(duì)象標(biāo)識(shí)改變其行為。例如:我們目前的服務(wù)端中使用了類(lèi)似的實(shí)現(xiàn)方式(雖然不是使用的缺省Servant,但只使用了一個(gè)Servant對(duì)象來(lái)處理所有請(qǐng)求)bool CBusClientForRpcServer:RegisterRpcService(const string &strAppName, const CRpcObjectPtr &rpcObject)CRpcObjectAdapterPtr poAdapter = m_poVar-m_poMainAdapter;poAdapter-add(rpcObje
37、ct, m_poVar-m_poRpcCommunicat-stringToIdentity(strAppName);poAdapter-activate();return true;1. ICE運(yùn)行時(shí)1.9 服務(wù)端實(shí)現(xiàn)技術(shù)1.9.3 混合途徑及緩存(Hybrid Approaches and Caching)即:一些性能要求較高的Servant可直接加入ASM中,其它不經(jīng)常訪問(wèn)的對(duì)象可通過(guò)缺省Servant實(shí)現(xiàn)。1. ICE運(yùn)行時(shí)1.9 服務(wù)端實(shí)現(xiàn)技術(shù)1.9.4 Servant逐出器(Servant Evictors)逐出器是維護(hù)有servants 緩存的servant 定位器。 只要有請(qǐng)求
38、到達(dá)(也就是說(shuō), Ice run time 調(diào)用了locate),逐出器就在它的緩存中檢查,看是否能找到可用于該請(qǐng)求的servant。如果有,它就返回這個(gè)已經(jīng)在緩存中實(shí)例化的servant ;否則,它實(shí)例化一個(gè)servant,并把它增加到緩存中。 緩存是一個(gè)按照“最近最少使用”(LRU)順序維護(hù)的緩存:最近最少使用的servant 處在隊(duì)列的尾部,最近使用最多的servant 處在隊(duì)列的頭部。如果某個(gè)servant 被從緩存中返回,或增加到緩存中,它就會(huì)從當(dāng)前的隊(duì)列位置移到隊(duì)列頭部,也就是說(shuō),“最新”的servant 總是在頭部,“最老”的servant 總是在尾部。 隊(duì)列的長(zhǎng)度可以配置,并決
39、定會(huì)有多少servant 存放在緩存中;如果針對(duì)某個(gè)Ice 對(duì)象的請(qǐng)求在內(nèi)存中沒(méi)有對(duì)應(yīng)的servant,且緩存滿了,逐出器就會(huì)在隊(duì)尾移除最近最少使用的servant,給要在隊(duì)頭實(shí)例化的servant騰出空間。 1. ICE運(yùn)行時(shí)1.9 服務(wù)端實(shí)現(xiàn)技術(shù)1.9.4 Servant逐出器(Servant Evictors)逐出器的實(shí)現(xiàn)和實(shí)現(xiàn)定位器一樣,只是該定位器中需要增加一個(gè)“最近最少使用”(LRU)隊(duì)列來(lái)緩存實(shí)例化過(guò)的Servant。class EvictorBase : public Ice:ServantLocator / ;1. ICE運(yùn)行時(shí)1.10 Ice線程模型Ice天生是一個(gè)多線程平
40、臺(tái),不存在單線程的Ice服務(wù)。你必須考慮并發(fā)問(wèn)題。 例如:請(qǐng)求可能被并發(fā)分派。1. ICE運(yùn)行時(shí)1.10.1 線程池介紹每個(gè)通信器創(chuàng)建兩個(gè)線程池:1. 客戶端線程池;(響應(yīng)請(qǐng)求回應(yīng)、AMI回調(diào))2. 服務(wù)端線程池;(分派請(qǐng)求、雙向連接回應(yīng))缺省情況下,這兩個(gè)線程池被通信器的所有適配器共享。如果需要,你可以為某個(gè)對(duì)象適配器配置私有的線程池;如果線程池中線程耗盡,則新的請(qǐng)求會(huì)被阻塞; 默認(rèn)池中線程數(shù)為1.1. ICE運(yùn)行時(shí)1.10 ice線程模型1.10.2 配置線程池每個(gè)線程池有一個(gè)唯一的名字;有下列屬性可設(shè)置:Name.SizeName.SizemaxName.SizeWarnName.Sta
41、ckSizeName.SeralizeName.ThreadIdleTime 客戶端和服務(wù)端線程池的名字為: Ice.ThreadPool.Client和Ice.ThreadPool.Server如果要監(jiān)視線程池活動(dòng)情況,可打開(kāi)屬性Ice.Trace.ThreadPool屬性。 動(dòng)態(tài)線程池:由name.Size、name.Sizemax、name.ThreadIdleTime決定 (Ice運(yùn)行時(shí)會(huì)按這些參數(shù)配置,動(dòng)態(tài)決定池中的線程數(shù))1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.10 ice線程模型例如,我們的Ice服務(wù)配置如下:1.10.3 適配器線程池 缺省情況下對(duì)象適配器和通信器是共享線程池的
42、。但是,在某些特殊情況下配置對(duì)象適配器自己的線程池也是很有用的: 1. 當(dāng)對(duì)象適配器的并發(fā)要求和通信器的并發(fā)要求不一致時(shí); 2. 確保對(duì)某個(gè)適配器的Servants的請(qǐng)求分派有最小數(shù)量的線程可用; 使用adapter.ThreadPool屬性進(jìn)行配置:adapter.ThreadPool.Sizeadapter.ThreadPool.SizeMax1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.10 ice線程模型1.10.4 設(shè)計(jì)考慮不合理的線程池配置可能會(huì)導(dǎo)致嚴(yán)重的性能問(wèn)題。設(shè)計(jì)應(yīng)用時(shí)可考慮如下一些問(wèn)題:(1) 只有1個(gè)線程的線程池的影響. 一次只有一個(gè)消息能被分派。這樣做可以不必考慮線程安全問(wèn)題
43、,但是它消除了可能的并行分派,這在多CPU的系統(tǒng)上將帶來(lái)性能瓶頸; .一次僅有一個(gè)AMI響應(yīng)可被處理。你必須增加客戶端線程池大小以便多個(gè)AMI回調(diào)能并發(fā)處理; .嵌套雙向調(diào)用將受到限制。單線程的情況下最多只能有1層雙向嵌套調(diào)用;需要注意:通信器的客戶端和服務(wù)端線程池缺省的最大線程數(shù)是1個(gè),使用時(shí)需要注意。1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.10 ice線程模型1.10.4 設(shè)計(jì)考慮(2) 使用多線程的線程池當(dāng)配置線程池支持多個(gè)線程時(shí)也就意味著ICE運(yùn)行時(shí)會(huì)并發(fā)的分派操作調(diào)用以及并發(fā)的處理AMI回調(diào)。這雖然會(huì)增加線程安全問(wèn)題上的設(shè)計(jì)考慮,但是它所帶來(lái)的可伸縮性和更高的吞吐量也是顯而易見(jiàn)的。具
44、體線程池最大線程數(shù)是多少也是需要精心考慮的。例如,超過(guò)實(shí)際處理器數(shù)量的線程數(shù)可增加系統(tǒng)的響應(yīng)性。但是過(guò)多的線程數(shù)也會(huì)起副作用。建議在真實(shí)使用環(huán)境下來(lái)測(cè)試系統(tǒng)最佳的線程數(shù)。 1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.10 ice線程模型1.10.4 設(shè)計(jì)考慮(3) 序列化時(shí)的考慮當(dāng)使用多線程線程池時(shí),線程調(diào)度的不確定性會(huì)導(dǎo)致調(diào)用分派順序可能和調(diào)用到來(lái)時(shí)的接收順序不一致。有些應(yīng)用不允許這種情況,例如一些事物處理服務(wù)必須保證順序。有兩種方式可以解決這個(gè)問(wèn)題:1. 使用單線程的線程池;2. 使用Serialize屬性(poolname.Serialize)配置多線程的線程池來(lái)處理序列化請(qǐng)求。 在客戶端避
45、免并發(fā)調(diào)用也可以避免上述問(wèn)題,但會(huì)降低客戶端的性能。 打開(kāi)Serialize屬性會(huì)增加處理延遲減小服務(wù)吞吐量。如果服務(wù)端必須保證客戶端請(qǐng)求順序,一個(gè)比較好的做法是序列化配合使用異步分派排隊(duì)到來(lái)的請(qǐng)求,將請(qǐng)求排隊(duì)放入一個(gè)隊(duì)列,然后由其它線程來(lái)執(zhí)行這些請(qǐng)求。 1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.10 ice線程模型1.10.5 嵌套調(diào)用 嵌套調(diào)用:一個(gè)Ice操作發(fā)生在另一個(gè)Ice操作的上下文中。 注意:如果有嵌套調(diào)用,則需要注意避免潛在的死鎖肯能。例如,調(diào)用時(shí)路徑出現(xiàn)環(huán)路。 這張圖中操作A嵌套雙向調(diào)用了操作B,但是操作B嘗試嵌套回調(diào)時(shí)發(fā)生死鎖。因?yàn)?,通信器缺省最大線程數(shù)是1個(gè),所以服務(wù)A中僅有
46、的一個(gè)線程正忙于等待操作B的調(diào)用完成,因此沒(méi)有線程來(lái)處理服務(wù)B的回調(diào)操作。這時(shí)客戶端因?yàn)榉?wù)A阻塞,所以它也被阻塞。 在這種場(chǎng)景下有多種方法可以避免死鎖發(fā)生: (1)增加服務(wù)A的線程池的最大線程數(shù)量; (2)使用單向調(diào)用; (3)另外再創(chuàng)建一個(gè)對(duì)象適配器用于回調(diào);(另外的適配器配置有自己的線程池) (4)操作A實(shí)現(xiàn)為異步分派和調(diào)用: 將操作A實(shí)現(xiàn)為AMD方式,調(diào)用操作B實(shí)現(xiàn)為AMI方式。這樣服務(wù)A中的線程不用一直 阻塞去等待操作B的完成。 1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.10 ice線程模型1.10.5 嵌套調(diào)用是否使用嵌套調(diào)用:是否設(shè)計(jì)成嵌套調(diào)用需要考慮一些因素: (1)線程池的配置
47、是否能滿足嵌套調(diào)用要求; (2)雙向連接所帶來(lái)的復(fù)雜性,因此你必須小心處理線程的使用; (3)各通信模塊中的同步問(wèn)題也需要考慮,為了同步所加入的鎖也可能導(dǎo)致死鎖。所以,在嵌套調(diào)用的情況下,跟蹤調(diào)用路徑來(lái)避免死鎖會(huì)變得很復(fù)雜。1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.10 ice線程模型1.10.6 向用戶線程分派調(diào)用 缺省情況下操作調(diào)用和AMI回調(diào)以及操作分派所使用的線程都是Ice運(yùn)行時(shí)線程池中的線程。這樣做很方便,不用考慮線程的創(chuàng)建和銷(xiāo)毀。 但是Ice運(yùn)行時(shí)線程數(shù)量有限,當(dāng)運(yùn)行時(shí)線程耗盡后將無(wú)法繼續(xù)接收新的調(diào)用和分派。 例如,我們的目前的服務(wù)端實(shí)現(xiàn)中使用了一個(gè)自己的線程池,所有到來(lái)的調(diào)用請(qǐng)求會(huì)
48、先放入一個(gè)請(qǐng)求隊(duì)列中,然后由服務(wù)端自己的線程池去處理請(qǐng)求。這樣,Ice運(yùn)行時(shí)的線程池中始終有空閑線程可用于接收新的請(qǐng)求。virtual bool Dispatch(const CRpcDispatchResultPtr &pCallback, const std:string &strOperationName,const BYTE_VECTOR &oInStream)GetLogger().debug(Operation %s Dispatch, strOperationName.c_str();bool bOk = RequestHandlerMgr:get_mut
49、able_instance().AddRequest(pCallback, strOperationName, oInStream);if (!bOk)UnknownDispatch(pCallback, strOperationName, oInStream);return bOk;1. ICE運(yùn)行時(shí)1. ICE運(yùn)行時(shí)1.10 ice線程模型1.11 代理的使用及配置(Proxies) 代理對(duì)象能夠使得遠(yuǎn)程調(diào)用像本地調(diào)用一樣簡(jiǎn)單。事實(shí)上,處理遠(yuǎn)程調(diào)用只是代理對(duì)象的眾多職責(zé)之一。 代理還封裝了連接遠(yuǎn)程對(duì)象所需的足夠信息,包括標(biāo)識(shí)、地址信息(傳輸端點(diǎn))等。 代理方法還提供了訪問(wèn)配置及連接信息的功
50、能,以及創(chuàng)建新代理對(duì)象的功能。代理負(fù)責(zé)所需的新連接的建立。 代理分成兩類(lèi): 直接代理其內(nèi)部保存有某個(gè)對(duì)象的標(biāo)識(shí),以及它的服務(wù)器的運(yùn)行地址;(ObjectIdent:tcp h p 9999)間接代理其內(nèi)部保存有某個(gè)對(duì)象的標(biāo)識(shí),以及對(duì)象適配器名(object adapter name)(ObjectIdent或ObjectIdentAdapterName)。1. ICE運(yùn)行時(shí)1.11 代理1.11.1 獲取代理字符串表示的代理: 通信器的stringToProxy方法可從代理的字符串標(biāo)識(shí)創(chuàng)建一個(gè)代理對(duì)象: Ice:ObjectPrx p = communicator-string
51、ToProxy(“ident:tcp p 5000”);代理屬性: 除了上述硬編碼方式表示代理對(duì)象,還可通過(guò)配置屬性將代理外部化。例如,可以定義一個(gè)屬性包含代理字符串標(biāo)識(shí): MyApp.Proxy-ident:tcp p 5000可以使用通信器的propertyToProxy方法從配置屬性得到代理對(duì)象。1. ICE運(yùn)行時(shí)1.11 代理例如: 配置文件中配置了代理 Hello.Proxy=hello:tcp -p 10000通信器初始化時(shí)加載了這個(gè)該配置文件 initDperties-load(configFile);使用通信器方法propertyToProxy創(chuàng)建代理HelloP
52、rx twoway = HelloPrx:checkedCast( communicator()-propertyToProxy(Hello.Proxy);1.11.1 獲取代理通過(guò)工廠方法創(chuàng)建代理 代理提供一些方法允許改變已有的代理的某些特性,得到新的代理。因?yàn)榇肀旧硎遣豢勺兊?,工廠方法會(huì)返回新的代理對(duì)象。 例如: ice_oneway方法返回一個(gè)單向調(diào)用代理對(duì)象。 注意:如果原代理的配置和新代理配置不一樣,則返回的是一個(gè)新代理對(duì)象實(shí)例。 checkCast和uncheckedCast方法也可以認(rèn)為是工廠方法,因?yàn)樗麄円矔?huì)返回新代理對(duì)象。 HelloPrx twoway = HelloPr
53、x:checkedCast(communicator()-propertyToProxy(Hello.Proxy)-ice_twoway()-ice_timeout(-1)-ice_secure(false); if(!twoway) cerr argv0 : invalid proxy ice_oneway(); HelloPrx batchOneway = twoway-ice_batchOneway(); HelloPrx datagram = twoway-ice_datagram(); HelloPrx batchDatagram = twoway-ice_batchDatagram
54、();1. ICE運(yùn)行時(shí)1.11 代理1.11.3 代理的端點(diǎn) 代理傳輸端點(diǎn)是位于客戶側(cè)的并等同于對(duì)象適配器的傳輸端點(diǎn)。代理傳輸端點(diǎn)標(biāo)識(shí)了同遠(yuǎn)程對(duì)象通信用的協(xié)議信息。例如:tcp h p 10000這個(gè)端點(diǎn)標(biāo)示一個(gè)遠(yuǎn)程對(duì)象,改對(duì)象可通過(guò)tcp協(xié)議連接,該對(duì)象處于主機(jī)上,端口10000。代理對(duì)象必須至少能獲取到一個(gè)端點(diǎn)。 直接代理對(duì)象可包含1個(gè)或多個(gè)端點(diǎn): MyObject:tcp h p 10000:ssl h o 10001如果直接代理不含有-h項(xiàng),則Ice運(yùn)行時(shí)將使用屬性Ice.Default.Host。如果Ice.Default.Host也未定義,則localhost網(wǎng)絡(luò)接口將被使用。
55、間接代理只有對(duì)象標(biāo)識(shí)或還有適配器名,它使用定位服務(wù)來(lái)動(dòng)態(tài)獲取傳輸端點(diǎn)。 MyObject或MyObjectAdapterName1. ICE運(yùn)行時(shí)1.11 代理1.11.4 端點(diǎn)過(guò)濾 代理的配置決定了它的端點(diǎn)如何使用。例如,一個(gè)配置為安全通信的代理它的端點(diǎn)必須使用安全協(xié)議,如SSL。 如下表中列出了一些工廠方法返回的代理對(duì)象其端點(diǎn)必須根據(jù)該代理對(duì)象的配置來(lái)使用。1. ICE運(yùn)行時(shí)1.11 代理1.11.4 端點(diǎn)過(guò)濾例如:Ice_secure()返回的代理對(duì)象只使用安全協(xié)議的端點(diǎn).如果沒(méi)有正確協(xié)議的端點(diǎn)可用,則連接建立時(shí)會(huì)收到NoEndpointException異常。 1. ICE運(yùn)行時(shí)1.1
56、1 代理1.11.5 缺省值與覆蓋 理解代理是如何受Ice配置屬性設(shè)置影響的是很重要的。相關(guān)屬性可分為兩類(lèi):缺省值和覆蓋值(defaults and overrides)。 缺省屬性缺省屬性 缺省屬性影響那些由Ice調(diào)用、stringToProxy或propertyToProxy創(chuàng)建的代理對(duì)象,不影響工廠方法創(chuàng)建的代理。 覆蓋屬性覆蓋屬性 設(shè)置覆蓋屬性將導(dǎo)致Ice運(yùn)行時(shí)忽略與之對(duì)應(yīng)的代理設(shè)置而直接使用覆蓋屬性設(shè)置。例如:Ice.Override.Secure=1 指示Ice運(yùn)行時(shí)只使用安全端點(diǎn),相當(dāng)于對(duì)每個(gè)代理調(diào)用ice_secure(true)。但是這個(gè)屬性不會(huì)改變已存在的代理的設(shè)置,而是指
57、示Ice運(yùn)行時(shí)使用安全端點(diǎn)而不去理會(huì)代理自身的安全設(shè)置。 1. ICE運(yùn)行時(shí)1.11 代理1.12 Ice:Contextmodule Ice local dictionary Context; 上下文就是一個(gè)把串映射到串的詞典,或者從概念上說(shuō),上下文就是一系列名- 值對(duì)。 每當(dāng)有請(qǐng)求要發(fā)往服務(wù)器時(shí),這個(gè)詞典的內(nèi)容(如果有的話)都會(huì)隨同請(qǐng)求一起整編,也就是說(shuō),如果客戶在上下文中放入一些名- 值對(duì),并在發(fā)出調(diào)用時(shí)使用這個(gè)上下文,服務(wù)器就將能使用客戶所發(fā)送的這些名- 值對(duì)。 上下文提供了一種手段,可以把數(shù)量不限的參數(shù)從客戶發(fā)往服務(wù)器,而不必在操作的型構(gòu)中提到這些參數(shù)。例如:PersonPrx p
58、= .;Address a = .;Ice:Context ctx;ctxwrite policy = immediate;p-setAddress(a, ctx);/ 在服務(wù)端,Current c;Ice:Context:const_iterator i = c.ctx.find(write policy); 1. ICE運(yùn)行時(shí)1.12 Ice:Context注意:通過(guò)使用Ice:Context,在處理每一個(gè)請(qǐng)求時(shí),它們可以向服務(wù)端傳入一些上下文信息。上下文的設(shè)計(jì)用途是傳送簡(jiǎn)單的token (比如事務(wù)標(biāo)識(shí)符),你應(yīng)該只把上下文用于這樣的目的,而不要把它用于其他目的。 例如,如果服務(wù)端設(shè)計(jì)上必
59、須接收上下文,但是它是無(wú)法強(qiáng)制客戶端調(diào)用時(shí)一定會(huì)傳入上下文的,如果客戶端沒(méi)有發(fā)送上下文信息,服務(wù)端可能無(wú)法工作或異常。1. ICE運(yùn)行時(shí)1.13 具有超時(shí)的代理代理方法Ice:ObjectPrx ice_timeout(Ice:Int t) const;會(huì)根據(jù)一個(gè)已有代理創(chuàng)建一個(gè)具有超時(shí)的代理,參數(shù)t以毫秒為單位,-1表示沒(méi)有超時(shí)。如果在超時(shí)代理上調(diào)用的操作沒(méi)有在超時(shí)時(shí)間內(nèi)完成,客戶端會(huì)收到異常。注意:連接的建立和關(guān)閉也有超時(shí): ConnectTimeoutException: 連接無(wú)法在制定時(shí)間內(nèi)建立; CloseTimeoutException:連接無(wú)法在指定時(shí)間內(nèi)關(guān)閉。同樣支持覆蓋屬性來(lái)
60、設(shè)置超時(shí)時(shí)間: Ice.Override.Timeout Ice.Override.ConnectTimeout(設(shè)置了覆蓋參數(shù)后,代理自身的超時(shí)設(shè)置會(huì)被覆蓋)1. ICE運(yùn)行時(shí)1.13具有超時(shí)的代理注意: 這些超時(shí)是“軟”超時(shí),也就是說(shuō),它們不是精確的、實(shí)時(shí)的超時(shí)(精確度受制于底層操作系統(tǒng)的能力)。 Ice run time把超時(shí)當(dāng)作是嚴(yán)重的出錯(cuò):例如,超時(shí)會(huì)導(dǎo)致客戶端的連接關(guān)閉。 超時(shí)應(yīng)該被用于防止客戶在“服務(wù)器發(fā)生錯(cuò)誤”的情況下無(wú)限期地阻塞; 1. ICE運(yùn)行時(shí)1.14 單向調(diào)用單向調(diào)用客戶端發(fā)送調(diào)用后不關(guān)心任何服務(wù)端回應(yīng),服務(wù)端也不會(huì)給客戶端任何回應(yīng),客戶端不關(guān)心調(diào)用是否成功。單向調(diào)用(客戶端側(cè)) 在客戶端,調(diào)用的發(fā)送是通過(guò)把請(qǐng)求寫(xiě)到客戶的本地傳輸緩沖區(qū)來(lái)完成的;一旦本地傳輸機(jī)制接受了調(diào)用,調(diào)用就會(huì)完成,并把
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒繪本講述與演繹幼兒繪本講述的停連運(yùn)用技巧講解
- 2025景區(qū)商場(chǎng)蛇年新春嘉年華活動(dòng)策劃方案
- 2025綠洲集團(tuán)工程合同管理規(guī)范
- 沙石采購(gòu)合同范本工程合同
- 2025【合同范本】打印機(jī)耗材長(zhǎng)期供貨合同
- 防雷技術(shù)服務(wù)合同
- 2025某購(gòu)物中心合同管理規(guī)定模板
- 服務(wù)訂報(bào)合同書(shū)
- 杭州房屋租賃合同模板
- 托管合同范本-多篇
- 湖南汽車(chē)工程職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試參考試題庫(kù)(含答案)
- 第2課+古代希臘羅馬(教學(xué)設(shè)計(jì))-【中職專(zhuān)用】《世界歷史》(高教版2023基礎(chǔ)模塊)
- 中儲(chǔ)糧蘭州公司考試筆試題庫(kù)
- 焊接機(jī)器人在汽車(chē)制造中應(yīng)用案例分析報(bào)告
- 重建成長(zhǎng)型思維課件
- 電捕焦油器火災(zāi)爆炸事故分析
- 質(zhì)量問(wèn)題分析及措施報(bào)告
- 汽修廠安全風(fēng)險(xiǎn)分級(jí)管控清單
- 現(xiàn)代通信原理與技術(shù)(第五版)PPT全套完整教學(xué)課件
- 病例展示(皮膚科)
- DB31T 685-2019 養(yǎng)老機(jī)構(gòu)設(shè)施與服務(wù)要求
評(píng)論
0/150
提交評(píng)論