DurabilityQosPolicy
在数据分发系统中,DurabilityQosPolicy
(持久性质量服务策略)定义了在 DataReader
加入主题时,系统如何处理已经存在的数据样本。其核心功能是确保即使在没有任何 DataReader
的情况下,DataWriter
仍然可以通过一个主题发送消息,并且后续加入的 DataReader
能够访问之前写入的信息。
QoS Policy 数据成员列表:
- 数据成员名称:
kind
- 类型:
DurabilityQosPolicyKind
- 默认值:
- 对于
DataReaders
:VOLATILE_DURABILITY_QOS
- 对于
DataWriters
:TRANSIENT_LOCAL_DURABILITY_QOS
- 对于
- 类型:
注意:该QoS策略适用于主题、数据读取器和数据写入器实体,并且一旦启用就无法更改。
重要事项
为了使 DataReader
接收过去的样本,除了设置这个 QoS 策略,还必须将 ReliabilityQosPolicy
设置为 RELIABLE_RELIABILITY_QOS
。
警告:为了保证数据写入器和读取器之间的兼容性,它们必须遵循兼容性规则。
DurabilityQosPolicyKind
有四种可能的值(见下表):
- VOLATILE_DURABILITY_QOS: 忽略过去的样本,新加入的 DataReader 只接收它匹配后的样本。
- TRANSIENT_LOCAL_DURABILITY_QOS: 新加入的 DataReader 的历史记录会填充过去的样本。
- TRANSIENT_DURABILITY_QOS: 新加入的 DataReader 的历史记录会填充存储在持久存储中的过去样本。
- PERSISTENT_DURABILITY_QOS: 类似于 TRANSIENT_DURABILITY_QOS,但也强调了持久存储的重要性。
兼容性规则
为了维持不同种类间的数据写入器和读取器之间的一致性,当它们具有不同的种类值时,数据写入器的种类必须大于或等于数据读取器的种类。各种类之间的顺序如下:
- VOLATILE_DURABILITY_QOS < TRANSIENT_LOCAL_DURABILITY_QOS < TRANSIENT_DURABILITY_QOS < PERSISTENT_DURABILITY_QOS
可用组合表:
DataWriter kind | DataReader kind | Compatibility |
---|---|---|
VOLATILE_DURABILITY_QOS | VOLATILE_DURABILITY_QOS | Yes |
VOLATILE_DURABILITY_QOS | TRANSIENT_LOCAL_DURABILITY_QOS | No |
VOLATILE_DURABILITY_QOS | TRANSIENT_DURABILITY_QOS | No |
TRANSIENT_LOCAL_DURABILITY_QOS | VOLATILE_DURABILITY_QOS | Yes |
TRANSIENT_LOCAL_DURABILITY_QOS | TRANSIENT_LOCAL_DURABILITY_QOS | Yes |
TRANSIENT_LOCAL_DURABILITY_QOS | TRANSIENT_DURABILITY_QOS | No |
TRANSIENT_DURABILITY_QOS | VOLATILE_DURABILITY_QOS | Yes |
TRANSIENT_DURABILITY_QOS | TRANSIENT_LOCAL_DURABILITY_QOS | Yes |
TRANSIENT_DURIBILITY_YES | TRANSIENT_UNDERSIGNS | Yes |
示例代码
以下是一个使用 C++ 的示例,该示例展示了如何设置和应用此 QoS 策略:
// 创建一个 DataWriter Qos 对象
DataWriterQos writer_qos;
// 持久性 QoS 策略默认为 VOLATILE_DURIABLITY
// 将其更改为 TRANSITENTLOCAL
writer_qos.durability().kind = TRANSIENT_LOCAL durability_qo;
// 使用修改过后的 QoS 创建相应实体
writer_ = publisher_->create_datawriter(topic_, writer_qos);
通过以上解释与示例,我们可以了解到,DurabilityQosPolicy
在实现可靠的数据传输中起着至关重要的作用,使得新加入的数据读取者能够获取到之前已经发布的数据。
内容由零声教学AI助手提供,问题来源于学员提问