2009-12-10 67 views
2

問題:如何獲取展位發佈者連接和斷開的活動通知?OpenDDS和發佈者存在通知

背景: 我正在使用OpenDDS實現,其中有一個數據類型(dt)的發佈者和訂閱者,使用同一主題,位於不同的計算機上。

用戶端的閱讀器已覆蓋on_data_available(...)on_liveliness_changed(...)的實施。我的用戶首先啓動,導致回撥到on_liveliness_changed(...),這表示沒有可用的寫入器。當發佈者開始時,我得到一個新的回調,告訴我有一位作家可用,當發佈者發佈時,調用on_data_available(...)。到目前爲止,一切都按預期工作。

發佈者的作者有重寫的實現on_publication_matched(...)。由於我們已經有用戶啓動,因此在啓動發佈者時,on_publication_matched(...)被調用。

問題是,當發佈者斷開連接時,我在讀者端沒有回調到on_liveliness_changed(...),也沒有在發佈者重新啓動時得到新的回調。

我試圖通過設置readerQos.liveliness.lease_duration來更改readerQos。 但結果是on_data_available(...)永遠不會被調用,唯一的回調on_liveliness_changed(...)是在啓動,告訴我,有沒有發佈者。

DDS::DataReaderQos readerQos; 
DDS::StatusKind mask = DDS::DATA_AVAILABLE_STATUS | DDS::LIVELINESS_CHANGED_STATUS | DDS::LIVELINESS_LOST_STATUS ; 
m_subscriber->get_default_datareader_qos(readerQos); 
DDS::Duration_t t = { 3, 0 }; 
readerQos.liveliness.lease_duration = t; 
m_binary_Reader = static_cast<binary::binary_tdatareader(m_subscriber->create_datareader(m_Sender_Topic,readerQos,this, mask, 0, false)); 

/的Kristofer

回答

4

好了,想有沒有在這裏很多DDS的用戶。

經過一番研究,我發現,只有當這種兼容性標準被滿足時讀取/寫入的比賽:提供lease_duration < =請求lease_duration

的解決方案是建立作家的QoS提供同樣的活力。可能有一種方法可以檢查是否可以由相應的作者提供請求的讀寫器QoS,如果不是,則使用「較低」的QoS,但您還沒有嘗試過。

在on_liveliness_changed回調方法中,我簡單地評估了來自LivelinessChangedStatus的alive_count。

/Kristofer