我在订阅数据(使用java平台)时遇到问题。当订阅者订阅某个主题时,必须从DDS中删除该订阅的数据。但在我的情况下,每当我订阅数据时,相同的数据都会被订阅多次。数据不会从DDS中删除。我尝试了QoS,但我不知道如何使用它。
请建议我如何从DDS中删除读取的数据。
此行为不是由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
的新更新覆盖。
为了解决您的问题,您可以将read()
替换为take()
,如下所示:
FooReader.take(
dataSeq, infoSeq, 10,
ANY_SAMPLE_STATE.value,
ANY_VIEW_STATE.value,
ANY_INSTANCE_STATE.value);
take()
方法与read()
方法的不同之处在于它进行破坏性读取;它不仅读取数据,而且将其从CCD_ 14中移除。这样,您将永远不会收到两次相同的样本。事实上,如果您一直使用take()
而不是read()
,您将永远无法看到任何样本两次。
解决问题的另一种方法是坚持使用read()
,但将请求的SAMPLE_STATE
从ANY
调整为NOT_READ
,如下所示:
FooReader.read(
dataSeq, infoSeq, 10,
NOT_READ_SAMPLE_STATE.value,
ANY_VIEW_STATE.value,
ANY_INSTANCE_STATE.value);
这样,您将只读取以前没有读取过的样本。在这种情况下,与take()
的不同之处在于,数据在FooReader
中仍然可用,如果您想在稍后阶段重新读取它,这可能会很有用(在这种情况中,您需要使用ANY
采样状态,而不是NOT_READ
来获得以前读取的采样)。