slice的AMD方法實現與調用

藉由一個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、異步方法分派僅僅影響到了接口在服務器端的實現,任何客戶端的請求操作和服務器端的服務加載均和普通接口一致
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章