【问题标题】:Remove read topic from DDS从 DDS 中删除阅读主题
【发布时间】:2012-07-12 05:07:57
【问题描述】:

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

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

【问题讨论】:

    标签: publish-subscribe data-distribution-service


    【解决方案1】:

    此行为不是由您的 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_STATEANY 调整为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 来获取以前读取的样本)。

    【讨论】:

    • 谢谢雷尼尔。这真的很有用,解决了我的问题。
    • 不客气。请确保通过单击复选标记接受任何回答您的问题的回答——您目前已经接受了六个问题中任何一个的零回答。查看一些说明here
    • 嗨 Rinier,现在,我的要求是我有很多订阅者,但发布者是单身。我的订阅者从 DDS 读取数据并检查该消息是针对该特定订阅者的。如果检查成功,那么它只需要数据并从 DDS 中删除。消息必须保存在 DDS 中,直到经过身份验证的订阅者获取它的数据。我如何使用 DDS(在 java 环境中)实现这一点??
    • 由于这是一个单独的问题,可能需要进行一些讨论,请将其作为一个新问题提出。
    猜你喜欢
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 2020-06-17
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多