Я хотел бы понять, почему OpenDDS повторно отправляет одни и те же последние данные n раз (где n — количество уже отправленных сообщений) при удалении DataWriter?
Это эффект определенного QoS, который я пропустил?
Вывод небольшого теста, который я сделал:
Received data ! ID = 0 Text = Hello world !
Received data ! ID = 1 Text = Hello world !
Received data ! ID = 2 Text = Hello world !
Received data ! ID = 3 Text = Hello world !
Received data ! ID = 4 Text = Hello world !
Received data ! ID = 5 Text = Hello world !
Received data ! ID = 6 Text = Hello world !
Received data ! ID = 7 Text = Hello world !
Received data ! ID = 8 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Мы ясно видим в этом примере 10 сообщений были отправлены и получены DataReader. Затем, как только DataWriter был удален (или во время удаления?), Появляется 10 повторов последнего полученного сообщения.
Хотя у меня нет опыта работы с OpenDDS, я бы хотел остановиться на вашем собственном ответе, который мне не кажется правильным. Я основываю это на механизмах, описанных в Спецификация DDS.
Этот пустой DataSample символизировал уведомления об изменениях состояний внутри OpenDDS, когда DataWriter отключался.
Согласно спецификации DDS уничтожение DataWriter приводит к отмене регистрации всех его экземпляров. Эта отмена регистрации подразумевает изменение состояния экземпляров с ALIVE на NOT_ALIVE. Эти изменения состояния не являются «внутренними», как вы написали, но предназначены для того, чтобы быть видимыми для всех, кто заинтересован. Об этом можно узнать, подписав заявки. instance_state
поле в SampleInfo
состав.
В вашем случае вы написали 10 экземпляров (значений ключей), поэтому уничтожение DataWriter привело к 10 обновлениям, каждое из которых указывает на изменение состояния ранее опубликованных экземпляров.
Они не должны быть прочитаны, но должны рассматриваться как уведомления.
Поскольку эти обновления указывают на изменения только состояния экземпляров, valid_data
флаг сброшен, и действительно, их поля данных не должны быть прочитаны. Тем не менее, все еще можно определить, о каком экземпляре идет обновление, вызвав get_key_value () на рассматриваемом DataReader, и передать его InstanceHandle_t
найдено в поле instance_handle
из SampleInfo
структура. Если бы вы сделали это, то вы заметили бы, что будет уведомление для каждого ID
от 0 до 9 в вашем случае.
Выполняя поиск в Интернете, я нашел ответ на свой вопрос:
На самом деле, не было никаких данных внутри DataSample
, valid_data
Флаг полезно определить, если DataSample
есть данные или нет.
Эти пустые DataSample
символизированные уведомления об изменениях состояний внутри OpenDDS, когда DataWriter
ушел Они не должны быть прочитаны, но должны рассматриваться как уведомления.