ICE的AMI方法调用

原创 2012年03月21日 19:23:07
从一个例子来说明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);   

ICE异步程序设计-----AMI/AMD

1 简介 AMI 异步方法调用(AMI) 这个术语描述的是客户端的异步编程模型支持。如 果你使用AMI 发出远地调用,在Ice run time 等待答复的同时,发出调用的 线程不会阻塞。相反...
  • crazyhacking
  • crazyhacking
  • 2014年04月24日 14:24
  • 3843

ICE 学习进阶2-AMI 方式

ICE AMI
  • bruce_wang_janet
  • bruce_wang_janet
  • 2011年05月15日 15:33
  • 2481

ICE同步调用与异步调用(1)

1 前言          软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用(...
  • liuxuezong
  • liuxuezong
  • 2014年06月06日 21:09
  • 6565

ICE学习(八)-异步方法调用AMI

Asynchronous Method Invocation (AMI)是客户端的异步编程模型。和同步请求不同,AMI不会堵塞他所在的线程。对于服务器端来说,同步和异步请求是没有什么区别的。 基本...
  • kaede999
  • kaede999
  • 2015年10月23日 17:04
  • 1167

ICE的异步动态调用

1、ICE除了提供同步的动态调用,还提供了异步的动态调用:    Ice::AsyncResultPtr begin_ice_invoke(const std::string& operation,...
  • followshake
  • followshake
  • 2012年04月02日 22:10
  • 2139

实例解析: java实现Windows 录音控制智能家居(一)

一直想做一个可以录音的可执行JAVA APP,实现自然语言对话。 第一步就是实现把录音转成语义,比如你对着话筒说"你好",你获取回答相应的回复。你对着话筒说“今天的天气”,能够回复你今天的天气,或者...
  • huangmeimao
  • huangmeimao
  • 2017年08月06日 14:17
  • 4107

通过AMI接口远程控制Asterisk

Manager API简介 Asterisk管理接口(AMI)允许外部客户端程连接到Asterisk实例,并且可以通过TCP/IP流发送命令和读取事件。在试图跟踪Asterisk内部电话状态进,它就...
  • yetyongjin
  • yetyongjin
  • 2012年07月16日 17:42
  • 4498

Asterisk学习笔记之 -- AMI篇

简介         AMI  (Asterisk Manager Interface)。是Asterisk的管理接口。通过此接口,可以实现对Asterisk系统的监控和控制。 访问形式       ...
  • irwin_chen
  • irwin_chen
  • 2013年07月23日 14:04
  • 3456

Asterisk AMI事件几个问题说明

1. Asterisk AMI的事件如何产生?        manager_event()函数用于产生事件和发送事件到客户端,Asterisk代码中通过调用该函数来生成发送到AMI客户端的事件。#d...
  • southflow
  • southflow
  • 2010年10月15日 20:24
  • 4007

ICE的异步方法调用

ICE的AMI和AMD:        AMI:指的是客户端的调用.一般有一个代理类,一个回调类。 从服务端返回的数据在回调类中的ice_response函数中.        AMD...
  • oXiaoErBuYu123456
  • oXiaoErBuYu123456
  • 2016年07月25日 09:11
  • 578
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ICE的AMI方法调用
举报原因:
原因补充:

(最多只允许输入30个字)