【问题标题】:C++ CORBA DII issuesC++ CORBA DII 问题
【发布时间】:2010-09-28 05:29:38
【问题描述】:

请所有 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;

结果是即使服务器响应,它也一直在说 Polling。 这是一个基本的 DII 调用,我实际上是在 ACE/TAO 5.7.9 上测试代码。这个确切的代码在omniORB 4.1.4 上完美运行。但是,我真的希望这适用于 ACE/TAO。

【问题讨论】:

    标签: c++ corba tao


    【解决方案1】:

    通过将对象引用从 _ptr 更改为 _var 来修复。我编写了一个小型测试应用程序来验证这一点。更改指针类型后,它的行为符合预期,为响应提供服务。所以问题是获取对接口的初始引用。

    【讨论】:

      【解决方案2】:

      对此我不太确定,但在我看来,如果第一次投票响应失败,您将退出此功能。然后,当您回来时,您将发送 另一条 消息(使用 send_deferred() 呼叫),与第一条消息无关。

      这意味着,除非您运气好,并且在您致电 poll_response() 之前出现回复,否则您将始终收到投票消息。

      【讨论】:

      • 很抱歉没有澄清它,但我只是在代码中添加了注释。该特定轮询位于 while 循环中的单独函数中。所以它总是循环检查响应。正如我上面提到的,您将在 TAO 上看到“轮询...”连续输出,而在 omniORB 上它会立即返回。
      • 没有问题,@kuzyt,我会把它设为 CW,因为它没有那么有用,但我会留在这里记录下来。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多