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 文件。具体规则与操作流程如下:
(一)配置文件加载规则
- 自动加载:若配置文件定义在默认加载的文件中(如 Fast DDS 预设的配置文件),则在系统初始化时会自动加载,无需额外操作。
- 手动加载:若配置文件位于非默认文件中,需调用
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,无需在代码中逐一设置,大幅提升了配置的灵活性与可维护性。