Почему OpenDDS повторно отправляет те же самые последние данные при удалении DataWriter

Я хотел бы понять, почему 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 повторов последнего полученного сообщения.

0

Решение

Хотя у меня нет опыта работы с 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 в вашем случае.

0

Другие решения

Выполняя поиск в Интернете, я нашел ответ на свой вопрос:

На самом деле, не было никаких данных внутри DataSample, valid_data Флаг полезно определить, если DataSample есть данные или нет.

Эти пустые DataSample символизированные уведомления об изменениях состояний внутри OpenDDS, когда DataWriter ушел Они не должны быть прочитаны, но должны рассматриваться как уведомления.

0

По вопросам рекламы [email protected]