# DurabilityQoS

# 功能介绍

提供数据持久性服务。只要存在一对匹配的 DataWriter 和 DataReader,由 DataWriter 发布的数据就会被交付给 DataReader。但是 DataWriter 可以在创建 DataReader 之前发布数据。对于最初写入 DDS 样例后发现的 datareader,持久性 QoS 控制是否以及如何将发布的 DDS 样例存储在 DataWriter 应用程序中。datareader 使用此 QoS 请求接收在创建之前发布的 DDS 样本。

以下为 QoS 的 kind 属性能设置的值:DDS_VOLATILE_DURABILITY_QOS(不保存,易失的),也就是新开的订阅端无法收到发送端过去发送的历史数据。DDS_TRANSIENT_LOCAL_DURABILITY_QOS(历史数据保存在发送端,本地临时的),新开的订阅端可以收到保存在发布端本地的过去发送的历史数据。

注意:datareader 的接收数据的数目多少是根据 HistoryQoS 的 depth 和 kind 的值来确定;临时数据的存活周期是根据 LifeSpanQoS 来确定。

# 兼容性

当且仅当不等式“datawriter 的 durability 的 kind >= reader 的 durability 的 kind”为“TRUE”时,提供的值才被认为与所请求的值兼容。出于这种不等式的目的,DURABILITY 的 kind 的值被认为是有序的:

DDS_VOLATILE_DURABILITY_QOS < DDS_TRANSIENT_LOCAL_DURABILITY_QOS。

# 使用方法

DurabilityQoS 的成员列表。

表 1 DurabilityQoS 成员列表
类型 字段名 描述
Durability-QoSPolicy-Kind kind 没有订阅者时数据不会缓存 VOLATILE_DURABILITY_QOS, 没有订阅者也会缓存数据,数量有 history 控制 TRANSIENT_LOCAL_DURABILITY_QOS, 下面两种选项是需要配合 Durability 服务来使用: 数据缓存不受 DataWriter 生命周期影响 TRANSIENT_DURABILITY_QOS, 数据保存在硬盘中 PERSISTENT_DURABILITY_QOS

# DataWriter 端

1) QoS 赋值

对 datawriter 的 durability 的 kind 进行赋值,赋值后,把 QoS 作为参数传入 create_datawriter()创建该 QoS 的功能的 datawriter。

图 1 DataWriter 的 DurabilityQoS 赋值
### DataReader端

1) QoS 赋值

对 DurabilityQoS 的 kind 进行赋值,赋值给 QoS 后,将 QoS 作为参数传入 create_datareader()创建该 QoS 的功能的 datareader。

图 2 DataReader 的 DurabilityQoS 赋值

# 效果展示

1) 适用场景

您有一个偶尔发送数据的设备,并且其“持久性”类型设置为 VOLABILE。如果一个新的 DataReader 加入系统,它不会看到任何数据。如果希望 DataReader 接收有效的、旧的或新的数据,则双方都应将其 DURABILITY 类型设置为 TRANSIENT_LOCAL。这将确保数据读取器在启用后立即获取一些以前的 DDS 示例。

2) 使用例子

首先我们先在 dw 和 dr 上先使用 VOLATILE_DURABILITY_QOS,先启动 dw 在发送数据,depth 我们设置为 5 更容易看清,dw 发完五包数据后启动 dr,预想结果是 dr 收不到之前的历史数据,如下图所示。

图 3 VOLATILE_DURABILITY_QOS 的通信结果

这次我们在 dw 和 dr 上使用 TRANSIENT_LOCAL_DURABILITY_QOS,先启动 dw 发送数据,depth 设置为 5,dw 发送完五包数据后启动 dr,预想结果是 dr 收得到之前的五包历史数据,如下图所示。

图 4 TRANSIENT_LOCAL_DURABILITY_QOS 的通信结果