# DestinationOrderQoS
# 功能介绍
当多个 datawriter 为同一个主题发送数据时,datareader 的应用程序接收来自不同 datawriter 的数据的顺序是由 write_w_timestamp()时间戳参数决定,时间戳参数大在相对应时间戳小后面接收。
此策略控制每个订阅者如何解析运行在不同节点上的多个 datawriter(可能与不同的 publisher 相关联)写入的数据实例的最终值。因此当 datawriter 停止向同一主题发送更改时,所有应用程序将最终具有相同的状态。
每个 DDS 示例包括一个时间戳:源时间戳,源时间戳在写入数据时由 DataWriter 应用程序记录。
# 兼容性
当且仅当不等式“写者的 DestinationOrderQoSPolicyKind >= 读者的 DestinationOrderQoSPolicyKind”为“真”时,提供的值被认为与所请求的值兼容。为了使这一不等式有意义,DestinationOrderQoSPolicyKind 的值被认为是有序的,定义如下:BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS<
BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS。
所以要生效需要在 datawriter 端使用的 kind 值应该更高或者相等于 datareader 端。
DestinationOrderQoS 需要在 OwnerShipQoS 设置为共享 Shared 的情况下才能正常使用。
OwnerShipQoS: 此策略控制 DDS 服务是否允许多个 DataWriter 对象更新数据的同一实例。Kind 模式如下:
SHARED:接收者接收所有数据发送者发送的数据;
EXCLUSIVE:接收者只接收一个数据发送者发送的数据。由 OWNERSHIP_STRENGTH 策略决定哪个发送者有效
OWNERSHIP_STRENGTH:整数:value。在 OWNERSHIP 策略设置为独占式时,使用本策略来声明多个数据发送者的权重,以决策接收者以谁的数据为准。
# 使用方法
DestinationOrderQoSPolicy 成员列表如下表。
类型 | 字段名 | 描述 |
---|---|---|
Destination- Order- QoSPolicy | kind | 可以是: BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS, BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS。 这里我们定义第一个字段的值比第二个字段更小,在使用的时候一般把 datawriter 里的值设置为第二个字段,使他保持>=datareader 里的值,满足这个条件便才能让该 QoS 生效。 |
# DataWriter 端
1) QoS 赋值
对 destination_order 的 kind 进行赋值,赋值给 QoS 后,将 QoS 作为参数传入 create_datawriter()。
# DataReader 端
1) QoS 赋值
对 destination_order 的 kind 进行赋值,赋值给 QoS 后,将 QoS 作为参数传入 create_datareader()。
# 效果展示
1) 适用场景
您有两台以上的设备需要对同一个主题的 reader 进行发数据,同时对数据到达有先后要求,则可以使用该 QoS 去控制以达到预期。
2) 使用例子
我们设置两个程序,一个程序发送的时间戳纳秒数为 3000,一个程序发送的时间戳纳秒数为 9000。
我们先启动一个订阅程序和一个时间戳为 9000 的发布程序,结果如下图所示。
这次我们启动一个订阅程序,先启动一个时间戳为 9000 的发布程序,接收方会先接收到一包 9000 的数据,后启动一个时间戳为 3000 的发布程序,之后订阅方都会先接收到 3000 的数据再接收 9000 的数据,运行结果如下图所示。