从DDS中删除已读主题[英] Remove read topic from DDS

本文是小编为大家收集整理的关于从DDS中删除已读主题的处理方法,想解了从DDS中删除已读主题的问题怎么解决?从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 以获取先前读取的样本).

本文地址:https://www.itbaoku.cn/post/1794058.html