2012-07-12 51 views
3

閱讀題目我有訂閱的數據(使用Java平臺)的一個問題。訂閱者訂閱某個主題時,必須從DDS中刪除該訂閱的數據。但在我的情況下,無論何時訂閱數據,都會多次訂閱相同的數據。數據不會從DDS中刪除。我嘗試了QoS,但我不知道如何使用它。刪除DDS

請建議我如何從DDS取出讀取數據。

回答

2

此行爲不是由你的QoS設置造成的,而是由你的訪問DataReader的方法。當您檢索數據,你可能調用類似的循環以下read()

FooReader.read(
    dataSeq, infoSeq, 10, 
    ANY_SAMPLE_STATE.value, 
    ANY_VIEW_STATE.value, 
    ANY_INSTANCE_STATE.value); 

read()方法調用像這樣將返回所有當前可用的樣本在FooReader。在read()後,這些樣品仍處於FooReader仍然可用,那就是read()法的行爲。把閱讀看成是「偷看」。你調用read()方法以這種方式下一次,你會看到你之前所看到的,除非它們已從DataWriter覆蓋由新的更新所有樣本。

解決您的問題,你可以用take()更換read(),就像這樣:

FooReader.take(
    dataSeq, infoSeq, 10, 
    ANY_SAMPLE_STATE.value, 
    ANY_VIEW_STATE.value, 
    ANY_INSTANCE_STATE.value); 

take()方法的問題在於它做了破壞性讀取從read()方法不同;它不僅讀取數據,還將其從FooReader中刪除。這樣,你永遠不會收到同樣的樣品兩次。事實上,如果您始終使用take()而不是read(),則您將永遠無法看到任何樣品兩次。

另一種方法來解決你的問題是堅持read(),但調整要求SAMPLE_STATE,從ANYNOT_READ,像這樣:

FooReader.read(
    dataSeq, infoSeq, 10, 
    NOT_READ_SAMPLE_STATE.value, 
    ANY_VIEW_STATE.value, 
    ANY_INSTANCE_STATE.value); 

這樣的話,你只會看你有沒有看過樣品先前。在這種情況下,與take()不同的是,如果你想在稍後階段重新讀取它(在這種情況下,你需要使用ANY樣品狀態,而不是NOT_READ數據並在FooReader仍然可用,這可能是有用的以獲得先前讀取的樣本)。

+0

謝謝你Reinier。這真的很有用,解決了我的問題。 – Bathakarai 2012-07-13 04:06:11

+1

不客氣。請確保接受任何答覆,通過點擊複選標記來回答您的問題 - 目前,您的六個問題中的任何一個都已接受零答案。看到一些說明[這裏](http://stackoverflow.com/faq#howtoask) – 2012-07-13 04:11:09

+0

嗨Rinier,現在,我的要求是我有很多訂戶,但發佈商是單身。我的訂戶從DDS讀取數據並檢查該消息是否針對該特定訂戶。如果檢查成功,則只需要從DDS中取出數據並從中刪除。消息必須保存在DDS中,直到經過身份驗證的訂戶接收數據。我怎樣才能達到這個使用DDS(在Java環境中)? – Bathakarai 2012-07-16 08:38:37