從一個例子來說明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方法調用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
ICE的服務器對象實現
followshake
2020-02-25 16:53:10
slice的AMD方法實現與調用
followshake
2020-02-25 16:53:10
slice的c++映射
followshake
2020-02-25 16:53:10
ICE的屬性設置
followshake
2020-02-25 16:53:10
ice環境初始化和slice方法調用
followshake
2020-02-25 16:53:10
ICE的slice定義注意事項
followshake
2020-02-25 16:53:10
ICE運行環境備忘二
followshake
2020-02-25 16:53:10
ICE運行時環境備忘一
followshake
2020-02-25 16:53:10
ICE的服務器對象實現
followshake
2020-02-25 16:53:10
slice的AMD方法實現與調用
followshake
2020-02-25 16:53:10
slice的c++映射
followshake
2020-02-25 16:53:10
ICE的屬性設置
followshake
2020-02-25 16:53:10
ICE的工具集基本功能
followshake
2020-02-25 16:53:10
ice環境初始化和slice方法調用
followshake
2020-02-25 16:53:10
ICE的slice定義注意事項
followshake
2020-02-25 16:53:10