ICE的AMI方法調用

從一個例子來說明AMI方法的使用,例如如下的接口定義:
interface MyInterface 
{
    int op(double d, string s, out int i, out long l);
};


其映射生成的方法如下:
class MyInterface : public virtual IceProxy::Ice::Object
{
public:
    // 同步方法
Ice::Int op(Ice::Double d, const std::string& s, Ice::Int& i, Ice::Long& l);
Ice::Int op(Ice::Double d, const std::string& s, const Ice::Context& _ctx, Ice::Int& i, Ice::Long& l);
    
    // 異步方法
    Ice::AsyncResultPtr begin_op(Ice::Double d, const std::string& s);  
    Ice::AsyncResultPtr begin_op(Ice::Double d, const std::string& s, const Ice::Context& _ctx);
    Ice::Int end_op(Ice::Int& i, Ice::Long& l, const Ice::AsyncResultPtr& _res);
    
    // callback方法
    Ice::AsyncResultPtr begin_op(Ice::Double d, const std::string& s, const Ice::CallbackPtr& _cb
                            const Ice::LocalObjectPtr& _cookie = 0);  
    Ice::AsyncResultPtr begin_op(Ice::Double d, const std::string& s, const Ice::CallbackPtr& _cb, 
                            const Ice::Context& _ctx, const Ice::LocalObjectPtr& _cookie = 0);
    Ice::Int end_op(Ice::Int& i, Ice::Long& l, const Ice::AsyncResultPtr& _res);
};


typedef IceInternal::ProxyHandler<MyInterface> MyInterfacePrx;
typedef IceInternal::Handle<MyInterface> MyInterfacePtr;


Ice::AsyncResultPtr的定義中包含如下方法:
1、用於hash管理的==、<操作符定義和用於獲取hash值的getHash方法
2、用於獲取通信對象的getCommunicator方法
3、用於獲取連接的getConnection方法
4、用於獲取代理對象的getProxy方法
5、用於獲取操作名稱的getOperation方法
6、用於獲取cookie的getCookie方法
7、用於判斷異步調用是否結束的isComplete方法和同步等待結束的waitForComplete方法
8、用於判斷請求是否發送給服務器的isSent方法和同步等待消息發送給服務器的waitForSent方法


調用方法如下:
1、得到代理對象:
   Ice::Int i = 0;
   Ice::Long l = 0;
   Ice::ObjectPrx base = communicator->stringToProxy("MyInterface");
   MyInterfacePrx myinterface = MyInterfacePrx::checkCast(base);
2、同步方法調用:
   Ice::Int ret = myinterface->op(1.0, "abcdefg", i, l);
3、異步方法調用:
   Ice::AsyncResultPtr r =  myinterface->begin_op(1.0, "abcdefg"); 
   // ... To do something
   try 
   {
       Ice::Int ret = myinterface->end_op(i, l, r);
   }
   catch (const Ice::Exception& ex)
   {
       cerr<<"Exception is: "<<ex<<endl;
   };
4、回調方法的調用:
   class MyCallback : public IceUtil::Shared
   {
   public:
       void onResponse(const Ice::AsyncResultPtr& r)
  {
      MyInterfacePrx myinterface = MyInterfacePrx::uncheckedCast(r->getProxy());
  MyCookiePtr cookie = MyCookiePtr::dynamicCast(r->getCookie());
  try 
  {
  Ice::Int ret = myinterface->end_op(i, l, r);
  }
  catch (const Ice::Exception& ex)
  {
  cerr<<"Exception is: "<<ex<<endl;
  };
  }
   };
   typedef IceUtil::Handle<MyCallback> MyCallbackPtr;
   
   MyCallbackPtr cb = new MyCallback;
   Ice::CallbackPtr d = Ice::newCallback(cb, &MyCallback::onResponse);
   myinterface->begin_op(1.0, "abcdefg", d);
5、cookie的使用:
   class MyCookie : public Ice::LocalObject
   {
   public:
       Cookie(const std::string& s) _s(s) {}
  std::string& getString() {return _s;}
   private:
       std::string _s;
   };
   typedef IceUtil::Handle<MyCookie> MyCookiePtr;
   
   MyCookiePtr ck = new MyCookie("abcdefg");
   myinterface->begin_op(1.0, "abcdefg", d, ck);
6、上述回調需要做安全的向下類型轉換,其實ice提供了一個回調方法模板,類似如下:
   class MyCallback : public IceUtil::Shared
   {
   public:
       void onSuccess(Ice::Int ret, Ice::Int i, Ice::Long l)
  {
  }
       void onSuccess(Ice::Int ret, Ice::Int i, Ice::Long l, const MyCookiePtr& cookie)
  {
  }
  void onFailure(const Ice::Exception& ex)
  {
  }
   };
   typedef IceUtil::Handle<MyCallback> MyCallbackPtr;
   
   MyCallbackPtr cb = new MyCallback;
   Ice::Callback_MyInterface_opPtr d = Ice::newCallback_MyInterface_op(cb, &MyCallback::onSuccess, &MyCallback::onFailure);
   MyCookiePtr ck = new MyCookie("abcdefg");
   myinterface->begin_op(1.0, "abcdefg", d, ck);
   
   注意該處的回調對象智能指針模式爲:Callback_<interface>_<operation>ptr,創建該指針的方法爲:newCallback_<interface>_<operation>
7、ice其實還爲你生成了另外一個方法,如果你調用某一個操作,不用關心起返回值,也不用關心成功調用,只關心起調用過程中異常,那麼可以如下調用:
   Ice::Callback_MyInterface_opPtr d = Ice::newCallback_MyInterface_op(cb, &MyCallback::onFailure);
   myinterface->begin_opVoid(1.0, "abcdefg", d);   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章