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,無需在代碼中逐一設置,大幅提升了配置的靈活性與可維護性。