Pergunta

Todos esses especialistas da Corba poderiam me ajudar com este.

Eu tenho um aplicativo multithread com algum código que envia uma mensagem para um servidor e aguarda uma resposta de volta. Eu posso ver que o servidor está enviando a resposta de volta, no entanto, o aplicativo parece não receber.

Heres parte do meu código.

  // Create a request object for the given message
  msg.request = serverRef->_request("receiveCoreMessageVia");
  msg.request->set_return_type (CORBA::_tc_short);

  msg.request->add_in_arg() <<= msg.sourceGateway;
  msg.request->add_in_arg() <<= msg.octetSeq;

  msg.request->send_deferred();

  ...
  // The following code is in a while loop in a different function. It uses the request reference to check the response.
  // Check if the request has completed
  if (!msg->request->poll_response())
  {
    clssendlog << debug << "Polling..." << endl;

    return false; // No response yet
  }

  // Get the returned result
  clssendlog << debug << "Get response..." << endl;
  msg->request->get_response();

  clssendlog << debug << "Reading the returned response value" << endl;
  CORBA::Short tmp = 0;
  msg->request->return_value () >>= tmp;

O resultado é que ele continua dizendo que a pesquisa mesmo que o servidor responda. Esta é uma invocação básica de DII e estou testando o código no ACE/TAO 5.7.9. Este código exato funciona perfeitamente no Omniorb 4.1.4. No entanto, eu realmente quero que isso funcione no ACE/TAO.

Foi útil?

Solução

Conseguiu corrigir alterando a referência do objeto de _ptr para _var. Eu escrevi um pequeno aplicativo de teste para verificar isso. Depois de alterar o ponteiro, ele se comporta como esperado, atendendo às respostas. Portanto, o problema foi obter a referência inicial à interface.

Outras dicas

Não tenho muita certeza disso, mas me parece que você vai saída Esta função se a primeira resposta da pesquisa falhar. Então, quando você voltar, você enviará outro mensagem (com o send_deferred() ligue), independente do primeiro.

Isso significa que, a menos que você atinja com sorte e uma resposta apareça antes de ligar poll_response(), você sempre receberá uma mensagem de votação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top