OpenDDS开发手册---第三章(服务质量)1

来源:互联网 发布:淘宝爱奇艺会员不见了 编辑:程序博客网 时间:2024/03/29 03:59

3.1 介绍

    前面的示例对各种实体使用默认 qos 策略。本章讨论了在 OpenDDS 中实现的 qos 策略以及它们的使用.有关在此中讨论的策略的更多信息, 请参见 dds 规范。

3.2 Qos 策略

    每个策略定义一个用于指定其数据的结构。每个实体都支持策略的子集, 并定义由受支持的策略结构组成的 qos 结构。给定实体的允许策略集受嵌套的策略结构约束在其 qos 结构中。例如, 发布者的 qos 结构是在规范的 idl :
module DDS {
struct PublisherQos {
PresentationQosPolicy presentation;
PartitionQosPolicy partition;
GroupDataQosPolicy group_data;
EntityFactoryQosPolicy entity_factory;
};
};
    设置策略与获取已设置了默认值的结构一样简单,根据需要修改各个策略结构, 然后应用 qos 结构到实体 (通常是在创建时)。我们展示了如何获取默认 qos 的示例3.2.1 节中的各种实体类型的策略。
    应用程序可以通过调用 set_qos () 操作来更改任何实体的 qos在实体上。如果 qos 是可更改的, 则现有关联将被删除, 如果它们不再兼容和新的关联被添加, 如果它们变得兼容。dcpsinforepo根据 qos 规范重新评估 qos 兼容性和关联性。如果兼容性检查失败, 对 set_qos () 的调用将返回错误。关联重新评估可能导致删除现有的协会或新的协会的加法。
    如果用户尝试更改不可变的 qos 策略, 则set_qos () 返回 dds:: RETCODE_IMMUTABLE_POLICY。
   qos 策略的一个子集是可更改的。一些可更改的 qos 策略, 如USER_DATA, TOPIC_DATA, GROUP_DATA, LIFESPAN, OWNERSHIP_STRENGTH, TIME_BASED_FILTER,ENTITY_FACTORY, WRITER_DATA_LIFECYCLE, 和READER_DATA_LIFECYCLE, 不需要兼容性和关联重估。DEADLINE 和 LATENCY_BUDGET 的 qos 策略需要进行兼容性重新评估, 但不能用于关联。PARTITION  qos 策略不需要兼容性重新评估, 但需要关联重新评估。dds规范列表 TRANSPORT_PRIORITY 可变, 但 OpenDDS 实现不支持动态修改此策略。

3.2.1 默认的QoS策略值

   应用程序通过实例化 qos 结构来获取实体的默认 qos 策略实体的适当类型, 并通过引用传递给相应的在适当的工厂实体上执行 get_default_entity_qos () 操作。(例如, 您将使用域参与者获取发布服务器或订阅服务器的默认 qos。下面的示例说明如何获取发布服务器、订阅服务器的默认策略,主题、域参与者、数据编写者和数据读取器
// Get default Publisher QoS from a DomainParticipant:
DDS::PublisherQos pub_qos;
DDS::ReturnCode_t ret;
ret = domain_participant->get_default_publisher_qos(pub_qos);
if (DDS::RETCODE_OK != ret) {
std::cerr << "Could not get default publisher QoS" << std::endl;
}
// Get default Subscriber QoS from a DomainParticipant:
DDS::SubscriberQos sub_qos;
ret = domain_participant->get_default_subscriber_qos(sub_qos);
if (DDS::RETCODE_OK != ret) {
std::cerr << "Could not get default subscriber QoS" << std::endl;
}

// Get default Topic QoS from a DomainParticipant:
DDS::TopicQos topic_qos;
ret = domain_participant->get_default_topic_qos(topic_qos);
if (DDS::RETCODE_OK != ret) {
std::cerr << "Could not get default topic QoS" << std::endl;
}
// Get default DomainParticipant QoS from a DomainParticipantFactory:
DDS::DomainParticipantQos dp_qos;
ret = domain_participant_factory->get_default_participant_qos(dp_qos);
if (DDS::RETCODE_OK != ret) {
std::cerr << "Could not get default participant QoS" << std::endl;
}
// Get default DataWriter QoS from a Publisher:
DDS::DataWriterQos dw_qos;
ret = pub->get_default_datawriter_qos(dw_qos);
if (DDS::RETCODE_OK != ret) {
std::cerr << "Could not get default data writer QoS" << std::endl;
}
// Get default DataReader QoS from a Subscriber:
DDS::DataReaderQos dr_qos;
ret = sub->get_default_datareader_qos(dr_qos);
if (DDS::RETCODE_OK != ret) {
std::cerr << "Could not get default data reader QoS" << std::endl;
}

下表总结了 OpenDDS 中每个实体类型的默认 qos 策略, 以可应用哪些策略












原创粉丝点击