2010-01-04 2 views
1

wustl CORBA 릴리즈에서 주식 시세 예제를 수정합니다.CORBA AMI 호출이 콜백을 생성하지 않습니까?

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 :

할당 통화가

가 여기 내 FactoryHandler 구현의) (get_stock을 처리하는 StockFactory 클래스에 대한 응답 핸들러를 구현하는 것입니다

#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_)++; 
} 

그리고 변경된 부분 바로 앞에서 client.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 만 사용)는 정상적으로 작동합니다.

무엇이 잘못 되었습니까 (어떻게 수정합니까?).

EDIT : 다른 정보 비트 : 서버 측에서 StockFactory의 get_stock() 메서드가 호출됩니다.

답변

0

죄송합니다. 그러나 힌트는, 당신의 문제는 시간 이후에 false를 반환하도록 ORB가 할 수있는 작업장이있는 경우에만 그 work_pending 반환 사실이라고 생각 http://www.cs.wustl.edu/~schmidt/ACE-mail.html

에서 TOA의 maling 목록에서 HTH

0

당신의 질문을 클라이언트가 요청을 보냈고 서버가 응답을 보내기 전에

유효성을 검사하려면 루프에서 && orb->work_pending() 조건을 제거하고 시간 초과 인수를 취하는 perform_work 버전을 사용하면됩니다.

관련 문제