我在订阅数据时遇到问题(使用 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
中删除。这样,您将永远不会收到相同的 sample 两次。事实上,如果您一直使用 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
来获取之前读取的样本)。
关于publish-subscribe - 从 DDS 中删除已读主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11445299/