四、ICE服务——RUNTIME核心代码

本文详细介绍了 Ice 通信框架的主要组件,包括 Ice::Communicator 作为运行时的入口点,负责管理线程池、配置属性等资源。对象适配器在 Ice 运行时和服务器之间起桥梁作用,处理对象映射、生命周期管理和端点分配。此外,还讨论了 Ice::Current 对象在服务器端的作用,Servant 定位器的概念及其线程安全性,以及如何在实际运行时实例中使用这些概念。
摘要由CSDN通过智能技术生成

1  通信器 Ice::Communicator

2  对象适配器

3  Ice::Current 对象

4 Servant 定位器

5 RUNTIME 使用实例

通信器 Ice::Communicator 

Ice run time 的主进入点由本地接口 Ice::Communicator 表示。

Ice::Communicator 的一个实例与一些运行时资源是关联在一起的:

•客户端线程池

•服务器端线程池

•配置属性

•一个日志记录器对象

•一个统计对象

•一个缺省路由器

•一个缺省定位器

•一个插件管理器

•对象适配器

•module Ice {

     local interface Communicator

   {

       string proxyToString(Object* obj);

       Object* stringToProxy(string str);

       ObjectAdapter createObjectAdapter(string name);

       ObjectAdapter createObjectAdapterWithEndpoints(

       string name,

       string endpoints);

       void shutdown();

       void waitForShutdown();

       void destroy();

  }

  };

对象适配器 

一个通信器含有一个或更多对象适配器。对象适配器处在 Ice run time

和服务器之间的界线上,负有这样一些责任:

• 它把Ice对象映射到到来请求的servant,并把请求分派给每个servant中的

应用代码 (也就是说,对象适配器实现了一个向上调用接口,把 Ice run time 与服务器中的应用代码连接在一起)。

• 它协助进行生命周期操作,使得Ice对象和servant在创建和销毁时不会出

现竞争状况。

• 它提供一个或更多传输端点。客户通过这些端点访问适配器所提供的 Ice

对象 (创建没有端点的对象适配器也是可能的。这样的适配器被用于

双向回调)

活动 Servant 映射表 

对象适配器

module Ice {

local interface ObjectAdapter {

string getName();

Communicator getCommunicator();

Object* add(Object servant, Identity id);

Object* addWithUUID(Object servant);

void remove(Identity id);

void activate();

void hold();

void waitForHold();

void deactivate();

};

};

Ice::Current 对象 作为服务器端的每个骨架操作的最后一个参数

module Ice {

  local dictionary<string, string> Context;

  enum OperationMode { Normal, \Nonmutating, \Idempotent };

  local struct Current {

  ObjectAdapter adapter;

  Identity id;

  FacetPath facet;

  string operation;

  OperationMode mode;

  Context ctx;

};

};

定位器的引入场景
Servant 定位器的线程保证
接口 API

module Ice {

local interface ServantLocator {

Object locate( Current curr,out LocalObject cookie);

void finished( Current curr,Object servant,LocalObject cookie);

void deactivate();

};

};

Servant 定位器注册

module Ice {

local interface ObjectAdapter {

void addServantLocator(ServantLocator locator,

string category);

ServantLocator findServantLocator(string category);

// ...

};

};

RUNTIME 使用实例

 #include <IceBox/IceBox.h>

#include <Ice/Ice.h>

#include <Freeze/Freeze.h>

class AbstractIceBoxService : public ::IceBox::Service

{

public:

  AbstractIceBoxService();

  virtual void start(const ::std::string& , const ::Ice::CommunicatorPtr&, const ::Ice::StringSeq&);

  virtual void stop();

private:

  ::Ice::ObjectAdapterPtr _adapter;

  ::Ice::CommunicatorPtr _communicator;

  virtual void startIceService(const Ice::StringSeq args,std::map<std::string,::IceInternal::Handle<Ice::Object> >& objmap) = 0;

  virtual void stopIceService(std::map<std::string,::IceInternal::Handle<Ice::Object> >& objmap) = 0;  std::map<std::string,::IceInternal::Handle<Ice::Object> >m_ServObjmap; 

  std::string m_strVerSion;

};

RUNTIME 使用实例 

void AbstractIceBoxService::start(const string& name, const Ice::CommunicatorPtr& communicator, const Ice::StringSeq& args)

{

    _adapter = communicator->createObjectAdapter(name);

    .......

    startIceService(args,m_ServObjmap);

   char ServName[256] ={0};

  std::map<std::string,::IceInternal::Handle<Ice::Object> >::iterator itr =  m_ServObjmap.begin();  

  while( itr !=  m_ServObjmap.end())

{

        memset(ServName, 0,sizeof(ServName)); 

        snprintf(ServName, sizeof(ServName), "%s%s",itr->first.c_str(),m_strVerSion.c_str());

        _adapter->add(itr->second, communicator->stringToIdentity(ServName));

       ++itr;  }

    _adapter->activate();

    return;

}

class OrderServiceInitException {};

class OrderServiceI : public AbstractIceBoxService

{

public:

  OrderServiceI();

private:

RUNTIME 使用实例 

  void InitService()throw (OrderServiceInitException);

  virtual void startIceService(const Ice::StringSeq args,std::map<std::string,::IceInternal::Handle<Ice::Object> >& objmap) ;

  virtual void stopIceService(std::map<std::string,::IceInternal::Handle<Ice::Object> >& objmap);

  static void* monitor(void* param);

};

RUNTIME 使用实例 

ICE_DECLSPEC_EXPORT IceBox::Service*create(Ice::CommunicatorPtr)

{

  return new OrderServiceI;

}

void OrderServiceI::startIceService(const Ice::StringSeq args,std::map<std::string,::IceInternal::Handle<Ice::Object> >& objmap)

{

     InitService(); 

    segi::servcieOrder::tempqueryserver::TemplateQueryPtr TQueryPtr = new TemplateQueryI();

    objmap.insert(std::pair<string ,::IceInternal::Handle<Ice::Object> >("segi.servcieOrder.tempqueryserver.TemplateQuery",TQueryPtr));

   segi::servcieOrder::orderhandleserver::OrderHandlePtr OHandlePtr = new OrderHandleI();

   objmap.insert(std::pair<string ,::IceInternal::Handle<Ice::Object> >("segi.servcieOrder.orderhandleserver.OrderHandle",OHandlePtr));

   segi::servcieOrder::orderqueryserver::OrderQueryPtr OQueryPtr = new OrderQueryI();

   objmap.insert(std::pair<string ,::IceInternal::Handle<Ice::Object> >("segi.servcieOrder.orderqueryserver.OrderQuery",OQueryPtr));

    segi::servcieOrder::Compatibleserver::CompatibleInterfacePtr OCompatibleInterfacePtr = new CompatibleInterfaceI();

    objmap.insert(std::pair<string ,::IceInternal::Handle<Ice::Object>>("segi.servcieOrder.Compatibleserver.CompatibleInterface",OCompatibleInterfacePtr));

   segi::servcieOrder::ordersaveserver::OrderConsumePtr OOrderConsumePtr = new COrderConsumeI();

   objmap.insert(std::pair<string ,::IceInternal::Handle<Ice::Object>>("segi.servcieOrder.ordersaveserver.OrderConsume",OOrderConsumePtr));

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值