OpenSplice DDS: публикация до некоторого времени ожидания
Я каждый день узнаю больше о ддс, поэтому мой вопрос звучит странно. Я надеюсь, что это имеет смысл.
Одно из требований, предъявляемых к какой-либо оболочке dds, которую я пишу, заключается в том, что по истечении некоторого времени ожидания оно истекает, если не удается записать. Мой вопрос: как я могу это сделать?
На уроке веб-сайта Prism Tech есть объяснение, как использовать WaitSet
заблокировать операцию чтения, но как насчет записи?
Вот некоторый код, включая вопрос:
dds::domain::DomainParticipant dp(0);
dds::topic::Topic<MyType> topic(dp, "MyTopic");
dds::pub::Publisher pub(dp);
dds::pub::DataWriter<MyType> dw(pub, topic);
MyType t;
dw.write(t); //how can I make this block for 5 seconds (tops), and then throw an error on failure?
Я заметил, что в API есть функция DataWriter::wait_for_acknowledgements(int timeout)
, но это, похоже, связано с DataWriter
объект, а не конкретный вызов написания. Могу ли я связать это с вызовом выше?
1 ответ
Это настраивается в QoS, см. НАДЕЖНОСТЬ, поле "max_blocking_time". То, как вы установите это значение, будет зависеть от реализации поставщика. Обычно вы получаете текущее QoS, обновляете поле и записываете QoS обратно. Имейте в виду, что определенные политики QoS должны быть установлены до того, как что-то еще произойдет. Надежность - это "Перед включением" (по крайней мере, в той реализации, с которой я больше всего знакома), что означает, что вам нужно отключить средство записи данных, обновить QoS, а затем включить средство записи.
Если QoS можно установить вне приложения (например, через XML), вы можете легко установить политику. В противном случае вам нужно сделать это в коде.
Из спецификации:
Значение max_blocking_time указывает максимальное время, в течение которого операции DataWriter::write разрешено блокировать, если в DataWriter нет места для хранения записанного значения. Значение по умолчанию max_blocking_time=100 мс.