您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > ICE系列培训(三)
ICE系列培训(三)鲍齐权qqbao@fiberhome.com统一网管平台专项培训内容1.ICE运行时2.动态ICE3.连接管理4.FreezeMap1.1概述本章主要介绍ICE运行时的一些内部细节:通信器ICE上下文对象适配器连接超时对象标识单向、数据报、批量调用Current对象定位服务Servant自动重试ICE线程模型字符串编码代理插件开发1.ICE运行时1.2通信器通信器Ice::Communicator是Ice运行时的主入口点,其实例与一些运行时资源关联在一起:客户端线程池对象适配器服务端线程池配置属性对象工厂日志记录器统计对象缺省路由器缺省定位器插件管理器1.ICE运行时1.2通信器注意:不同通信器的对象适配器以及ICE对象是相互独立的;不同通信器使用其自己的线程池,互不干扰;通常情况下,一个服务器中使用一个通信器即可;某些情况下多通信器更有用:例如,IceBox对每个Ice服务使用不同的通信器这样保证不同服务间互不干扰;1.ICE运行时1.2通信器通信器接口:moduleIce{localinterfaceCommunicator{stringproxyToString(Object*obj);Object*stringToProxy(stringstr);…};};通信器提供大量接口来操作它所关联的运行时资源,后面介绍各个资源时再介绍。1.ICE运行时1.3通信器的初始化在创建通信器时,ICE运行时初始化了一系列通信器特性,这些特性影响通信器的行为;注意:这些特性生命期随通信器生命期一起,通信器创建后就不能更改了。因此,你必须在创建通信器时设置好这些特性;初始化使用Ice::initialize函数:namespaceIce{CommunicatorPtrinitialize(int&,char*[],constInitializationData&=InitializationData(),Int=ICE_INT_VERSION);CommunicatorPtrinitialize(StringSeq&,constInitializationData&=InitializationData(),Int=ICE_INT_VERSION);CommunicatorPtrinitialize(constInitializationData&=InitializationData()Int=ICE_INT_VERSION);}1.ICE运行时1.3通信器的初始化通信器创建时可以定制下列特性:•属性集合•日志接口•状态接口•宽/窄字符集转换器•线程通知hook•分派器•类装载器(仅java)1.ICE运行时1.3通信器的初始化要建立这些特性,你需要填充一个InitializationData结构:namespaceIce{structInitializationData{PropertiesPtrproperties;LoggerPtrlogger;StatsPtrstats;StringConverterPtrstringConverter;WstringConverterPtrwstringConverter;ThreadNotificationPtrthreadHook;DispatcherPtrdispatcher;};};1.ICE运行时示例:运行时属性集可从文件中读取InitializationDatainitData;initData.properties=createProperties();initData.properties-load(configFile);1.3通信器的初始化例如:定制一个类型为MyLogger的日志记录器…Ice::InitializationDataid;id.logger=newMyLoggerI;Ice::CommunicatorPtric=Ice::initialize(argc,argv,id);…1.ICE运行时例如,我们的总线客户端的通信器是在下面所示函数内初始化的:voidCBusClientForRpcClient::ClientInit(conststring&strUnmBusRegistryServerAddress,conststring&strClientName){Ice::InitializationDatainitData;…m_poVar-m_poRpcCommunicator=Ice::initialize(initData);…}1.4对象适配器对象适配器是位于Ice运行时和实际服务提供对象(Servant)之间,实现以下职责:(1)将Ice对象(《培训一》中有介绍什么是Ice对象和Servant)映射到Servant,并分派请求给Servant;(2)辅助Ice对象和Servant的生命期操作;(3)提供传输端点;注意:每个通信器可拥有一个或多个对象适配器;每个对象适配器可拥有一个或多个Servant;每个对象适配器可拥有多个传输端点,这些传输端点代表的是通向同一组对象的不同路径;每个对象适配器可非强制性拥有自己的线程池(通过adapter-name.ThreadPool.Size设置)如果设置了适配器自己的线程池,那么给对象适配器的分配操作将使用自己线程池中的线程,而不会使用通信器中的线程池。1.ICE运行时1.4.1活动Servant映射表每个对象适配器都维护有一个活动Servant映射表(ASM)。对于收到的客户端请求,对适配器会根据对象标识到ASM中查找正确的Servant来分派这个请求。注意:如果客户端请求包含的对象标识无法在ASM中找到正确的Servant,则适配器会返回ObjectNotExistException异常给客户端(适配器没有使用Servant定位器时)1.ICE运行时——1.4对象适配器1.4.2ServantsServant是位于服务端,为客户端提供实际服务业务的Ice对象实例,它使用具体语言实现Ice接口。注意:同一Servant可注册给多个对象适配器;…Ice::ObjectAdapterPtradapter=communicator()-createObjectAdapter(Hello);//ServantDemo::HelloPtrhello=newHelloI;adapter-add(hello,communicator()-stringToIdentity(hello));adapter-activate();…1.ICE运行时——1.4对象适配器HelloI实现的接口Slice定义:moduleDemo{interfaceHello{idempotentvoidsayHello(intdelay);voidshutdown();};};接口实现:classHelloI:publicDemo::Hello{};1.4.3对象适配器的创建及提供的接口对象适配器的创建:使用通信器提供的方法:::Ice::ObjectAdapterPtrcreateObjectAdapter(const::std::string&);::Ice::ObjectAdapterPtrcreateObjectAdapterWithEndpoints(const::std::string&,const::std::string&);::Ice::ObjectAdapterPtrcreateObjectAdapterWithRouter(const::std::string&,const::Ice::RouterPrx&);对象适配器提供了大量本地接口可用来访问适配器:moduleIce{localinterfaceObjectAdapter{stringgetName();CommunicatorgetCommunicator();//...};};1.ICE运行时——1.4对象适配器示例:Ice::ObjectAdapterPtradapter=ic-createObjectAdapterWithEndpoints(SimplePrinterAdapter,default-p10000);1.4.4Servant的激活与解除激活Servant激活:告知Ice运行时某个Servant的存在(加入ASM)。解除激活:将Servant从ASM中移除。对象适配器提供了add函数来激活和解除Servant:Object*add(Objectservant,Identityid);Object*addWithUUID(Objectservant);voidremove(Identityid);…1.ICE运行时——1.4对象适配器1.4.4Servant的激活与解除激活注意:不允许使用同一标识激活多次;不同标识可用来激活同一Servant多次,这种情况下同一Servant将表现为多个Ice对象;addWithUUID会自动为Servant生成一个UUID作为对象标识。…Demo::HelloPtrhello=newHelloI;//Servantadapter-add(hello,communicator()-stringToIdentity(hello));…1.ICE运行时——1.4对象适配器1.4.5对象适配器状态对象适配器具有三种状态:保持状态(holding);活动状态(active);不活动状态(inactive)。1.ICE运行时——1.4对象适配器1.4.5对象适配器状态保持状态(holding)处于保持状态的适配器,任何到来的请求客户端都会收到TimeoutException或ConnectTimeoutException异常。注意:出于保持状态下面向流协议的适配器(TCP/IP),服务端运行时会停止从相应的传输端点读数据,同时也会拒绝客户端的连接请求。对象适配器提供的操作:voidIce::ObjectAdapter::hold();该操作或将适配器置为hold状态,但是不会等待已有请求的完成,会立即返回。voidIce::ObjectAdapter::waitForHold();该操作会阻塞调用线程,知道所有已有请求完成。1.ICE运行时——1.4对象适配器1.4.5对象适配器状态活动状态(active)活动状态下的适配器可以接收并分派请求到servant注意:新创建的适配器初始化状态是Holding状态;双向连接的适配器不需要激活(双向连接参见1.7);并置调用(collocatedinvocation)即使适配器没有激活调用也会成功,除非你禁用了并置调用优化。对象适配器提供的操作:voidIce::ObjectAdapter::activate();激活对象适配器,例如:…Ice::ObjectAdapterPtradapter=communicator()-createObjectAdapter(Hello);Demo::HelloPtrhello=newHelloI;//Servantadapter-add(hello,communicator()-stringToIdentity(hello));adapter-activate();//激活适配器…1.ICE运行时——1.4对象适配器1.4.5对象适配器状态不活动状态(inactive)不活动状态下,适配器在概念上已经被销毁了。一旦适配器处于不活动状态,那么它将不能再被重新激活对象适配器提供的操作:voidIce::ObjectAdapter::deactivate();voidIce::ObjectAdapter::waitForDeactivate();voidIce::ObjectAdapter::isDeactivated();voidIce::ObjectAdapter::destroy();1.ICE运行时——1.4对象适配器1.4.6Endpoints(端点)Endpoints:由:
本文标题:ICE系列培训(三)
链接地址:https://www.777doc.com/doc-5006470 .html