3

我在订阅数据时遇到问题(使用 java 平台)。当订阅者订阅主题时,订阅的数据必须从 DDS 中删除。但就我而言,每当我订阅数据时,都会多次订阅相同的数据。数据不会从 DDS 中删除。我尝试了 QoS,但我不知道如何使用它。

请建议我如何从 DDS 中删除读取的数据。

4

1 回答 1

4

此行为不是由您的 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,从ANYNOT_READ,如下所示:

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

这样,您只会阅读以前未阅读过的样本。在这种情况下,不同之处take()在于数据确实在您的FooReader.样品)。ANYNOT_READ

于 2012-07-12T22:46:16.817 回答