簡體   English   中英

fastrtps:如何在發布/訂閱級別使用 DDS 歷史記錄?

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

我正在使用 fastrtps ( https://github.com/eProsima/Fast-RTPS ) C++ DDS 實現來發布和訂閱數據,使用它的發布/訂閱層(不是較低級別的讀取器/寫入器層)。 Fastrtps 支持歷史記錄,這意味着在發布者發布一些消息后加入的訂閱者應該能夠接收那些舊消息。 文檔非常清楚地解釋了如何在發布者和訂閱者端配置歷史記錄,但沒有關於如何讀取實際歷史消息的文檔。 我也無法從頭文件中找到任何線索。

如何使用 fastrtps 發布/訂閱層接收歷史消息?

正常的 fastrtps::SubscriberListener::onNewDataMessage() 回調似乎不適用於歷史記錄,僅適用於新消息(正如其簽名所暗示的那樣)。 我會期待這樣的事情:

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

也許

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

但是找不到這樣的東西。

當您在 DataWriter 上設置歷史記錄時,它會保存它發送的許多樣本。 當您在 DataReader 上設置歷史記錄時,它會請求許多以前發送的樣本。 注:讀者要求,作者提供。 如果讀者要求更多,它仍然只能得到作者提供的東西。 如果讀者請求較少,它只會為您的應用程序提供那么多。 (這樣說是因為可能會導致不同的行為——過濾在哪里發生?可能在寫入端,也可能在讀取端。取決於實現)。

現在,您的作者擁有 HISTORY qos 和一定數量的樣本。 您的閱讀器也有 HISTORY qos,並請求一定數量的先前發送的樣本。 “歷史”樣本和“現在”樣本之間沒有區別。 樣品到貨……您的申請會收到通知。

因為您的讀者以前從未見過它們,所以它們(對您的讀者而言)是樣本,並通過 onNewDataMessage() 報告給您。

沒有什么像“給我歷史樣本”這樣的東西,因為當你被通知樣本可用(或輪詢它們,或有一個聽眾,或者然而)時,你已經得到了它們。

如果您沒有看到創建 DataReader 的歷史樣本,那么您還有其他 QOS 斷開連接或內存使用問題或...

DDS 是不可配置的,但您確實需要了解其中的細微差別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM