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()
메서드가 호출됩니다.