我在订阅数据时遇到问题(使用 java 平台)。当订阅者订阅主题时,订阅的数据必须从 DDS 中删除。但就我而言,每当我订阅数据时,都会多次订阅相同的数据。数据不会从 DDS 中删除。我尝试了 QoS,但我不知道如何使用它。
请建议我如何从 DDS 中删除读取的数据。
我在订阅数据时遇到问题(使用 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()
在于它进行破坏性读取;它不仅会读取数据,还会将其从FooReader
. 这样,您将永远不会收到两次相同的样品。事实上,如果你一直使用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