publish-subscribe - 从 DDS 中删除已读主题

标签 publish-subscribe data-distribution-service

我在订阅数据时遇到问题(使用 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/

相关文章:

java - 提交方法不会调用 onNext FLOW STREAM API JAVA

zeromq - 是否可以从 ZeroMQ PUB 套接字获取过滤器列表?

clojure - 层板撤消虹吸管 - Clojure

python - 使用 Google App Engine 发布订阅

在 DDS 中为多个主题创建多个数据写入器

data-distribution-service - 如何在 DDS 的 idl 中建模

c++ - 将多态 C++ 对象转换为非多态 C 对象

python - 在 rclpy ROS2 中设置 pub&sub 中的端点

c++ - 如何将八位字节转换为 QString?

java - RxJava : PublishSubject acts synchronously