gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:43:07 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com