Paho C++ 异步客户端回调 vs action_listener vs connected_handler

Paho C++ async client callbacks vs action_listener vs connected_handler

我正在尝试了解使用 async_client 时 Paho MQTT C++ 库中各种回调机制的用法和行为,特别是:

我想要实现的目标:等待成功连接的阻塞初始化方法成功订阅主题列表(以单个主题开头),加上如果连接断开,自动重新连接 重新订阅这些主题。

'async_subscribe' 示例 (https://github.com/eclipse/paho.mqtt.cpp/blob/master/src/samples/async_subscribe.cpp) 建议我应该订阅 mqtt::callback::connected 中的主题。但是,它没有说明如何等待订阅成功完成。我的理解是我不应该在连接回调内的订阅令牌上调用 'wait'。如果我设置等待的私有 var _subscribeToken,似乎无法保证在等待连接令牌完成后是否已设置它,即(伪代码):

void Callback::connected(const std::string& cause){
    _subscribeToken = _client->subscribe(topic, qos, nullptr, action_listener);
}

初始化中:

token_ptr connectToken = connect(connectOpts);
connectToken->wait();

_subscribeToken->wait(); // but _subscribeToken may still be null at this point. 

connectToken->wait 如果不能保证回调已经被调用有什么意义?我很可能误解了什么,但我想指出正确的方向!

通过进一步深入研究 C++/C 库,我能够确定 Callback::connected 在 Token::on_success 之后被调用 (因此在等待之后已经完成了)。

似乎文档和示例在这方面不是很好。我在 Github 项目中提出了一个问题:https://github.com/eclipse/paho.mqtt.cpp/issues/256.

解决方案是:

  • 从连接令牌的 on_success 回调调用订阅 (首先确保 token_type == CONNECT)
  • 在Callback::connected如果原因是"automatic reconnect"我post回了个消息 我们需要重新订阅主题的主线程。然后我可以从主线程 处理重新连接(订阅并等待订阅令牌完成)。