关闭

ICE的AMI方法调用

2068人阅读 评论(0) 收藏 举报
从一个例子来说明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);   
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:88284次
    • 积分:1171
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:3篇
    • 译文:0篇
    • 评论:23条
    文章分类
    最新评论