从DDS中删除阅读主题

时间:2012-07-12 05:07:58

标签: publish-subscribe data-distribution-service

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

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

1 个答案:

答案 0 :(得分:3)

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