【问题标题】:Qpid proton c++ - proton::make_workQpid proton c++ - proton::make_work
【发布时间】:2018-07-12 21:01:12
【问题描述】:

我正在尝试在 proton::connection 对象的工作队列中添加 proton::work 函数(打开一个新的发送者)。我有一个指向工作队列的指针,但我的问题是如何正确绑定 open_sender 函数。

我知道这里真正的问题:函数的参数:

sender open_sender(const std::string& addr);

由于字符串是通过引用传递的,我必须取消引用它。我没问题,但是如何使用质子工具呢?

这是我的代码行:

proton::work w = proton::make_work( &proton::connection::open_sender, &m_connection, p_url);

注意:

  1. 当然我的项目中没有使用C++11,太简单了 问 ;) !
  2. 当然不能改成C++11
  3. 如果您对如何在多线程程序中创建新发件人有更好的了解,请告诉我。

【问题讨论】:

  • "由于字符串是通过引用传递的,我必须取消引用它。" .. 什么?您不需要“取消引用”引用。那会是什么样子?
  • 我的意思是相当于 boost::cref(),为 boost::bind() 的内部机制复制引用对象。这就是为什么我称它为“取消引用”它。
  • 好吧,你(和其他必须使用 C++11 之前的人)是我们将 make_work API 添加到质子 C++ 绑定的确切原因!这正是它应该使用的方式。您不会说您在使用它时是否遇到问题或问题是什么 - 在这种情况下很难提供帮助。
  • 哦 - 我现在明白你想要达到的目标 - 我会写一个实际的答案。

标签: c++ qpid


【解决方案1】:

通常您将在处理程序中使用proton::open_sender API 来打开连接或启动容器,因此在大多数情况下您不必使用proton::make_work。如果您查看 Proton C++ 示例,一个很好的起点是 simple_send.cpp。

缩写代码可能如下所示:

class simple_send : public proton::messaging_handler {
  private:
    proton::sender sender;
    const std::string url;
    const std::string addr;
...
  public:
    simple_send(...) :
      url(...), 
      addr(...)
    {}
...
    // This handler is called when the container starts
    void on_container_start(proton::container &c) {
        c.connect(url);
    }

    // This handler is called when the connection is open
    void on_connection_open(proton::connection& c) {
        sender = c.open_sender(addr);
    }
...
}

int main() {
...
  simple_send send(...);
  proton::container(send).run();
...
}

Proton C++ 附带了其他示例,它们应该可以帮助您找出使用 Proton C++ 的其他方法。见https://github.com/apache/qpid-proton/tree/master/examples/cpp

您还可以在 http://qpid.apache.org/releases/qpid-proton-0.20.0/proton/cpp/api/index.html 找到 API 文档(针对 2018 年 2 月的当前版本)。

【讨论】:

  • 感谢您的回答 StitchedUp。事实上,我已经回顾了大部分例子。你提到的这个很有趣,但对我的使用非常有限,因为我想随着时间的推移而不是一开始就创建新的发件人。现在我通过在普通线程中创建一个 Sender 然后调用 connection.wake() 在工作线程中实际创建它来解决这个问题,但我从来没有解决我最初的问题:使用 make_work() 创建一个发送者。这是一种耻辱,因为这将是最性感的方式。无论如何,你是 proton 的贡献者吗?
  • @Baptiste 好吧,如果你不能以任何其他方式做到这一点,最简单的事情可能是创建一个小的间接函数,你可以使用 container::schedule() 和 proton::make_work() 来调用它唯一的目的是调用 open_sender。
猜你喜欢
  • 2016-08-06
  • 2015-03-04
  • 2016-01-13
  • 2014-09-07
  • 1970-01-01
  • 2017-10-17
  • 2017-07-01
  • 2016-05-19
  • 2021-05-31
相关资源
最近更新 更多