所有那些CORBA专家都可以帮我解决这个问题。
我有一个多线程应用程序,其中包含一些代码,用于向服务器发送消息并等待响应。我可以看到服务器正在发送响应但是应用程序似乎没有收到它。
这是我代码的一部分。
// 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;
结果是,即使服务器响应,它也会继续说轮询。 这是一个基本的DII调用,我实际上在ACE / TAO 5.7.9上测试代码。这个确切的代码在omniORB 4.1.4上完美运行。但是,我真的希望这能用于ACE / TAO。
答案 0 :(得分:1)
通过将对象引用从_ptr更改为_var来管理以进行修复。我写了一个小测试应用程序来验证这一点。更改指针类型后,其行为与预期的服务响应。所以问题是获得对接口的初始引用。
答案 1 :(得分:0)
我对此不太确定,但在我看来,如果第一个轮询响应失败,您将退出此功能。然后,当您重新登录时,您将发送另一条消息(通过send_deferred()
调用),与第一条消息无关。
这意味着,除非你打得很幸运,并且在你致电poll_response()
之前出现回复,否则你将始终收到一条投票讯息。