fastrtps:如何在 publish/subscribe 级别使用 DDS 历史记录?

fastrtps: how to use DDS history on publish/subscribe level?

我正在使用 fastrtps (https://github.com/eProsima/Fast-RTPS) C++ DDS 实现来发布和订阅数据,使用它的 publish/subscribe 层(而不是较低级别的 reader/writer 层)。 Fastrtps 支持历史,这意味着订阅者在发布者发布了一些消息后加入应该能够接收到那些旧消息。文档非常清楚地解释了如何在发布者和订阅者端配置历史记录,但是没有关于如何读取实际历史消息的文档。我也没能从头文件中找到任何线索。

如何使用 fastrtps publish/subscribe 层接收历史消息?

普通 fastrtps::SubscriberListener::onNewDataMessage() 回调似乎不适用于历史记录,仅适用于新消息(如签名所示)。我会期待这样的事情:

fastrtps::Subsciber *mySubscriber;
(...)
mySubscriber->getHistory(...);

或者

MySubscriberListerner : public fastrtps::SubscriberListener
{
  (...)
  void onHistoryMessage();  // SubscriberListener callback
}

但是找不到这样的东西。

当您在 DataWriter 上设置历史记录时,它会保存已发送的样本数。当您在 DataReader 上设置历史记录时,它 请求 许多以前发送的样本。注:reader请求,作者提供。如果 reader 请求更多,它仍然只会得到作者提供的内容。如果 reader 请求较少,它只会让您的应用程序可用那么多。 (这样说是因为可能会导致不同的行为——过滤发生在哪里?可能在作者方面,可能在 reader 方面。取决于实现)。

现在,您的作者已经拥有了 HISTORY qos 和一定数量的样本。您的 reader 也有 HISTORY qos,并请求一定数量的先前发送的样本。 'historical' 样本和 'now' 样本之间没有区别。 样本到达...并通知您的应用程序。

因为您的 reader 之前没有见过它们,它们是(对您的 reader) new 样本并通过 onNewDataMessage( ).

没有什么比 "give me the historical samples" 更好的了,因为当您收到样本可用的通知(或轮询它们,或者有听众,或者然而)时,您已经得到了它们。

如果您没有看到有关创建 DataReader 的历史示例,那么您有其他 QOS 断开连接或内存使用问题或...

如果不可配置,DDS 就什么都不是,但您确实需要了解其中的细微差别。