从一个例子来说明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);
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);