从 DDS 中删除读取主题

2024-03-01

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

The read()像这样调用的方法将返回您的当前可用的样本FooReader。之后read(),这些样本仍然可以在FooReader,就是这样read()方法的行为。将阅读视为“偷看”。下次您调用read()通过这种方式,您将看到之前看到的所有示例,除非它们已被来自某个版本的新更新覆盖。DataWriter.

要解决您的问题,您可以更换read() with a take(), 像这样:

FooReader.take(
    dataSeq, infoSeq, 10,
    ANY_SAMPLE_STATE.value,
    ANY_VIEW_STATE.value,
    ANY_INSTANCE_STATE.value);

The take()方法不同于read()方法是进行破坏性读取;它不仅读取数据,还从其中删除数据FooReader。这样,您就不会两次收到相同的样本。事实上,如果你坚持使用take()相对于read(),您将永远无法两次看到任何样本。

解决问题的另一种方法是坚持read(),但调整要求SAMPLE_STATE, from ANY to 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以获得以前读取的样本)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 DDS 中删除读取主题 的相关文章

随机推荐