为什么在删除DataWriter时OpenDDS重新发送相同的最后一个数据
我想知道为什么OpenDDS在删除DataWriter时n次重发相同的最后一个数据n次(其中n是已发送的消息的数量)?为什么在删除DataWriter时OpenDDS重新发送相同的最后一个数据
难道我错过了特定QoS的影响吗?
一个小测试的输出我已经做:
Received data ! ID = 0 Text = Hello world !
Received data ! ID = 1 Text = Hello world !
Received data ! ID = 2 Text = Hello world !
Received data ! ID = 3 Text = Hello world !
Received data ! ID = 4 Text = Hello world !
Received data ! ID = 5 Text = Hello world !
Received data ! ID = 6 Text = Hello world !
Received data ! ID = 7 Text = Hello world !
Received data ! ID = 8 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
Received data ! ID = 9 Text = Hello world !
我们清楚地看到在例如10发送了邮件,并通过DataReader的好评。然后,一旦DataWriter被删除(或删除期间?),出现10次重复收到的最后一条消息。
虽然我没有专门的OpenDDS经验,但我想扩展自己的答案,这对我来说似乎并不完全正确。我将其基于DDS specification中描述的机制。
这些空的DataSample符号化了DataWriter关闭时OpenDDS内部状态变化的通知。
根据DDS规范,销毁DataWriter会导致注销其所有实例。注销意味着实例从ALIVE到NOT_ALIVE的状态改变。这些状态变化不像你写的那样是“内部的”,而是打算对任何感兴趣的人都可见。通过检查SampleInfo
结构中的instance_state
字段,可以使订阅应用程序知道这一点。
在你的情况下,你写了10个实例(键值),这样DataWriter的销毁就导致了10次更新,每次更新都表明以前发布的实例的状态发生了变化。
他们不应该阅读,但只是被视为通知。
由于这些更新仅指示实例状态的更改,因此将清除valid_data
标志,而且实际上不应读取它们的数据字段。但是,仍然可以通过在所涉及的DataReader上调用get_key_value()并将结构中的InstanceHandle_t
传递给它来确定更新是关于哪个实例。如果你这样做了,那么你会注意到在你的情况下会有一个从0到9的每个ID
的通知。
感谢您的回答,它确实延伸了我在互联网和文件中获得的信息。 – MSch8791
搜索在网络上,我找到了答案,以我自己的问题:
事实上,还有的DataSample
内没有数据。 valid_data
标志对于识别DataSample
是否有数据很有用。
这些空的DataSample
代表当DataWriter
发生故障时OpenDDS内部状态变化的通知。他们不应该阅读,而只是被视为通知。
在打印样本内容之前,您是否在'SampleInfo'上检查了'valid_data'标志? –
其实我没有检查这个标志。在我的代码中启用此验证我已经能够过滤它,谢谢。然而,我已经找到了在互联网上完整问题的答案...... – MSch8791