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