关闭

slice的AMD方法实现与调用

标签: exceptionstringinterface服务器classcallback
1116人阅读 评论(0) 收藏 举报
分类:
借由一个interface来说明amd方法的使用:
interface MyInterface
{
int NormalOp(string name, out long l);
["amd"] int AmdOp(string name, out long l);
};


生成的c++代码如下:
class MyInterface : public virtual IceProxy::Ice::Object
{
public:
       // normal方法
virtual Ice::Int NormalOp(const std::string& name, Ice::Long& l);
    
// amd方法
       virtual void Amdop_async(const AMD_MyInterface_AmdOpPtr&, const std::string& name);
};


class AMD_MyInterface_AmdOp : public ...
{
public:
void ice_response(Ice::Int ret, Ice::Long l);
void ice_exception(const std::exception& ex);
void ice_exception();
};


服务器接口实现:
class MyInterfaceI : virtual public MyInterface
{
public:
virtual Ice::Int NormalOp(const std::string& name, Ice::Long& l)
{
   cout<<"name :"<<name<<endl;
l = 10;
return 0;
}
    
        virtual void Amdop_async(const AMD_MyInterface_AmdOpPtr& cb, const std::string& name)
{
       cout<<"name :"<<name<<endl;
_workQueue->add(cb);

// which in workQueue, the code is
// cb->ice_response(0, 10);
}
}


注意:
1、一个接口中的方法要么是同步分派,要么是异步分派,不能二者同时存在,对于每个amd的接口操作均映射一个<operation>_async的分派方法和一个
   AMD_<interface>_<operation>的回调接口类。   
2、如果在服务端的方法实现中发生任何异常,需要捕获并通过对应的回调接口的ice_exception方法返回,ice的runtime不会自动捕获异常并返回给客户端
3、一般来说,如果在服务器端的接口实现中有任何阻塞的行为,例如IO阻塞,同步阻塞,那么最好将接口实现成异步方法分派的,并请请求的callback发送到工作线程中
   由工作线程来处理请求,并在完成请求后在合适的时间通过调用ice_reponse返回结果或者通过ice_exception返回异常
4、异步方法分派仅仅影响到了接口在服务器端的实现,任何客户端的请求操作和服务器端的服务加载均和普通接口一致
0
0

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