2017-01-12 62 views
0

我想知道爲什麼OpenDDS在刪除DataWriter時n次重發相同的最後一個數據n次(其中n是已發送的消息的數量)?爲什麼在刪除DataWriter時OpenDDS重新發送相同的最後一個數據

難道我錯過了特定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

在打印樣本內容之前,您是否在'SampleInfo'上檢查了'valid_data'標誌? –

+0

其實我沒有檢查這個標誌。在我的代碼中啓用此驗證我已經能夠過濾它,謝謝。然而,我已經找到了在互聯網上完整問題的答案...... – MSch8791

回答

0

雖然我沒有專門的OpenDDS經驗,但我想擴展自己的答案,這對我來說似乎並不完全正確。我將其基於DDS specification中描述的機制。

這些空的DataSample符號化了DataWriter關閉時OpenDDS內部狀態變化的通知。

根據DDS規範,銷燬DataWriter會導致註銷其所有實例。註銷意味着實例從ALIVE到NOT_ALIVE的狀態改變。這些狀態變化不像你寫的那樣是「內部的」,而是打算對任何感興趣的人都可見。通過檢查SampleInfo結構中的instance_state字段,可以使訂閱應用程序知道這一點。

在你的情況下,你寫了10個實例(鍵值),這樣DataWriter的銷燬就導致了10次更新,每次更新都表明以前發佈的實例的狀態發生了變化。

他們不應該閱讀,但只是被視爲通知。

由於這些更新僅指示實例狀態的更改,因此將清除valid_data標誌,而且實際上不應讀取它們的數據字段。但是,仍然可以通過在所涉及的DataReader上調用get_key_value()並將結構中的InstanceHandle_t傳遞給它來確定更新是關於哪個實例。如果你這樣做了,那麼你會注意到在你的情況下會有一個從0到9的每個ID的通知。

+0

感謝您的回答,它確實延伸了我在互聯網和文件中獲得的信息。 – MSch8791

0

搜索在網絡上,我找到了答案,以我自己的問題:

事實上,還有的DataSample內沒有數據。 valid_data標誌對於識別DataSample是否有數據很有用。

這些空的DataSample代表當DataWriter發生故障時OpenDDS內部狀態變化的通知。他們不應該閱讀,而只是被視爲通知。

相關問題