2010-01-04 26 views
1

我正在修改wustl CORBA版本中的股票報價例子。分配是實現該處理調用get_stock()CORBA AMI調用不生成回調?

這裏是我的FactoryHandler實施StockFactory類的回覆處理程序:

FactoryHandler_i.h:

#ifndef TAO_TUTORIALS_QUOTER_AMI_CLIENT_FACTORYHANDLER_I_H 
#define TAO_TUTORIALS_QUOTER_AMI_CLIENT_FACTORYHANDLER_I_H 

#include "QuoterS.h" 

class Stock_Factory_Handler_i : public POA_Quoter::AMI_Stock_FactoryHandler 
{ 
public: 
Stock_Factory_Handler_i (int *response_count, ::Quoter::Stock_var& result); 

    void get_stock (::Quoter::Stock_ptr ami_return_val); 
    void get_stock_excep (::Messaging::ExceptionHolder * excep_holder); 

private: 
    int *response_count_; 
    ::Quoter::Stock_var& result_; 
}; 

#endif /* TAO_TUTORIALS_QUOTER_AMI_CLIENT_HANDLER_I_H */ 

FactoryHandler_i.cpp:

#include "FactoryHandler_i.h" 
#include "ace/streams.h" 

Stock_Factory_Handler_i:: 
    Stock_Factory_Handler_i (int *response_count, ::Quoter::Stock_var& result) 
    : response_count_ (response_count), result_ (result) 
{ 
} 

void 
Stock_Factory_Handler_i::get_stock (::Quoter::Stock_ptr ami_return_val) 
{ 
    cout << "storing result" << endl; 
    result_ = ami_return_val; 
    (*this->response_count_)++; 
} 

void 
Stock_Factory_Handler_i::get_stock_excep (::Messaging::ExceptionHolder * excep_holder) 
{ 
    // We ignore the exception, but this counts as a response, otherwise 
    // the application would not finish. 
    cerr << "Exception raised while getting stock" 
     << endl; 
    (*this->response_count_)++; 
} 

而客戶端cpp,就在發生更改的部分之前:

// ... 
// Create and activate the handler... 
int response_count = 0; 
Single_Query_Stock_Handler_i handler_i (&response_count); 
Quoter::AMI_Single_Query_StockHandler_var handler = 
    handler_i._this(); 

// Create and activate the factory handler... 
Quoter::Stock_var result; 
Stock_Factory_Handler_i factory_handler_i (&response_count, result); 
Quoter::AMI_Stock_FactoryHandler_var factory_handler = 
    factory_handler_i._this(); 

// Send all the requests, careful with error handling 
int request_count = 0; 
for (int i = 2; i != argc+1; ++i) { 
    try { 
    // Get the stock object 
     cout << "looking up stock symbol " << argv[i] << endl; 
    factory->sendc_get_stock (factory_handler.in(), argv[i]); 
    sleep(3); // wait for a response 
     cout << "converting result" << endl; 
    Quoter::Single_Query_Stock_var stock = 
     Quoter::Single_Query_Stock::_narrow (result.in()); 
     cout << "checking result" << endl; 
     CORBA::Any any; 
     any <<= stock; 
     CORBA::TypeCode_var tc = any.type(); 
     cout << tc->kind() << endl; 
    if (CORBA::is_nil (stock.in())) { 
     cerr << "Cannot get single query interface for <" 
      << argv[i] << ">" << endl; 
     continue; 
    } 
     cout << "reading result" << endl; 
    stock->sendc_get_price_and_names (handler.in()); 
    request_count++; 
    } 
    catch (Quoter::Invalid_Stock_Symbol &) { 
    cerr << "Invalid stock symbol <" 
     << argv[i] << ">" << endl; 
    } 
} 

while (response_count < 2 * request_count // multiply by 2 because both handlers increment response_count 
     && orb->work_pending()) { 
    orb->perform_work(); 
} 
// ... 

當運行在客戶端,所述輸出爲:

looking up stock symbol MSFT 
converting result 
checking result 
14 
Cannot get single query interface for <MSFT> 

(該圖14是用於庫存的類型代碼,這是僅用於調試)

從上面值得注意的是缺少的是「存儲結果「應該在FactoryHandler的get_stock()回調方法中打印的消息。我不知道爲什麼,因爲sendc_get_stock()方法不會產生任何(即時)錯誤,基本上只是StockHandler代碼的一個副本,並且從那裏AMI/ORB接口負責進行回調。但最初的例子(只有StockHandler)工作正常。

我在做什麼錯了(以及如何解決它)?

編輯:另一位信息:在服務器端,StockFactory的get_stock()方法確實被調用。

回答

0

我認爲你的問題是,work_pending返回true只有在ORB有直接的工作要做,所以它返回後的時間假您的客戶發送了他的請求,並在服務器發送他的回覆之前。

要驗證這一點,只需從循環中刪除&& orb->work_pending()條件,然後使用帶有超時參數的perform_work版本。