【FastDDS】Layer DDS之Domain ( 04-DomainParticipantFactory)

Fast DDS 域参与者工厂(DomainParticipantFactory)详解

一、域参与者工厂(DomainParticipantFactory)基础定义

域参与者工厂(DomainParticipantFactory)的唯一作用是实现域参与者(DomainParticipant)对象的创建与销毁。该类自身不存在工厂类,而是以单例(singleton)对象的形式存在,可通过 DomainParticipantFactory 类的静态成员函数 get_instance() 来获取其实例。

DomainParticipantFactory 的行为可通过 DomainParticipantFactoryQos(域参与者工厂服务质量)中指定的 QoS 值进行修改。由于 DomainParticipantFactory 是单例对象,其 QoS 只能通过 DomainParticipantFactory::set_qos() 成员函数进行调整。

需要注意的是,DomainParticipantFactory 并非实体(Entity),因此不支持关联任何监听器(Listener)。

二、域参与者工厂服务质量(DomainParticipantFactoryQos)

DomainParticipantFactoryQos 用于控制 DomainParticipantFactory 的行为,其内部包含以下 QosPolicy(服务质量策略)对象,各策略的访问器/修改器及可变性信息如下表所示:

QosPolicy(服务质量策略)类访问器/修改器(Accessor/Mutator)可变性(Mutable)
EntityFactoryQosPolicy(实体工厂服务质量策略)entity_factory()是(Yes)
ThreadSettings(线程设置)shm_watchdog_thread()否(No)
ThreadSettings(线程设置)file_watch_threads()否(No)

(一)QoS 修改规则与作用

由于 DomainParticipantFactory 是单例对象,其 QoS 仅能通过 DomainParticipantFactory::set_qos() 成员函数修改。其中,EntityFactoryQosPolicy 策略中的 autoenable_created_entities(自动启用创建的实体)参数尤为关键——该参数直接决定了通过 DomainParticipantFactory 创建的 DomainParticipant 是否在创建后自动启用:

  • autoenable_created_entities = true 时,新创建的 DomainParticipant 会自动启用,无需额外调用启用函数。
  • autoenable_created_entities = false 时,新创建的 DomainParticipant 处于禁用状态,需手动调用启用函数才能正常工作。

(二)DomainParticipantFactoryQos 操作示例代码

以下代码展示了如何修改 DomainParticipantFactory 的 QoS,并基于不同 QoS 配置创建 DomainParticipant

DomainParticipantFactoryQos qos;

// 1. 将autoenable_created_entities设为true:创建的DomainParticipant会自动启用
qos.entity_factory().autoenable_created_entities = true;
if (DomainParticipantFactory::get_instance()->set_qos(qos) != RETCODE_OK)
{
    // 错误处理
    return;
}

// 基于上述QoS创建DomainParticipant(返回的域参与者已自动启用)
DomainParticipant* enabled_participant =
        DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT);
if (nullptr == enabled_participant)
{
    // 错误处理
    return;
}

// 2. 将autoenable_created_entities设为false:创建的DomainParticipant会处于禁用状态
qos.entity_factory().autoenable_created_entities = false;
if (DomainParticipantFactory::get_instance()->set_qos(qos) != RETCODE_OK)
{
    // 错误处理
    return;
}

// 基于上述QoS创建DomainParticipant(返回的域参与者需手动启用)
DomainParticipant* disabled_participant =
        DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT);
if (nullptr == disabled_participant)
{
    // 错误处理
    return;
}

三、从 XML 文件加载配置文件(Loading Profiles from an XML File)

若需基于 XML 配置文件(Profiles)创建实体(Entities),需先加载包含这些配置文件的 XML 文件。具体规则与操作流程如下:

(一)配置文件加载规则

  1. 自动加载:若配置文件定义在默认加载的文件中(如 Fast DDS 预设的配置文件),则在系统初始化时会自动加载,无需额外操作。
  2. 手动加载:若配置文件位于非默认文件中,需调用 load_XML_profiles_file() 成员函数手动加载 XML 文件中的配置。关于 XML 配置文件的格式规范及自动加载机制,可参考“XML Profiles”(XML 配置文件)章节。

(二)加载 XML 配置文件并创建实体的示例代码

以下代码展示了如何手动加载 XML 配置文件,并使用其中的配置创建 DomainParticipant

// 加载包含配置文件的XML文件(文件名为"profiles.xml")
DomainParticipantFactory::get_instance()->load_XML_profiles_file("profiles.xml");

// 基于XML中定义的配置文件(名为"participant_profile")创建DomainParticipant
DomainParticipant* participant_with_profile =
        DomainParticipantFactory::get_instance()->create_participant_with_profile(0, "participant_profile");
if (nullptr == participant_with_profile)
{
    // 错误处理
    return;
}

通过上述操作,创建的 DomainParticipant 会自动应用 XML 配置文件中“participant_profile”配置项定义的 QoS settings,无需在代码中逐一设置,大幅提升了配置的灵活性与可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ray.so

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值