fastDDS之Domain

一个domain代表了一个独立的通信平面。它在共享公共通信基础结构的实体之间创建了逻辑分离。从概念上讲,它可以被视为一个虚拟网络,将运行在同一个域中的所有应用程序连接起来,并将它们与运行在不同域中的应用程序隔离开来。通过这种方式,几个独立的分布式应用程序可以在同一个物理网络中共存,而不会相互干扰,甚至可以相互感知。
每个域都有一个唯一的标识符,称为domainId,实现为uint32值。共享系统domainId的应用程序属于同一个域,相互之间能够进行通信。想要添加到域的应用程序必须使用适当的domainId通过DomainParticipantFactory单例创建DomainParticipant实例。
Partitions分区在Domain中引入了另一种实体隔离级别。即使DomainParticipant在同一个域中,但是仍然可以将它们的发布者和订阅者通过Partitions隔离到不同的分区。

在这里插入图片描述

DomainParticipant

DomainParticipant是应用程序到域的入口点。每个DomainParticipant从创建之初就链接到一个域,并包含与该域相关的所有实体。它还充当Publisher、Subscriber和Topic的工厂。
DomainParticipant的行为可以通过DomainParticipantQos上指定的QoS值进行修改。QoS值可以在创建DomainParticipant时设置,也可以稍后使用DomainParticipant::set_qos()成员函数进行修改。 DomainParticipant实例会通过DomainParticipantListener通知状态的更改。
DomainParticipantQos,包含所有可以为一个确定的DomainParticipant设置的Qos,控制DomainParticipant的行为,他包含以下QosPolicy对象:
在这里插入图片描述
之前创建的DomainParticipant的QoS值可以使用DomainParticipant::set_qos()成员函数修改。尝试在已经启用的DomainParticipant上修改不可变QosPolicy将导致错误。在这种情况下,不会应用任何更改,并且DomainParticipant将保持其以前的DomainParticipantQos。
默认的DomainParticipantQos是指由DomainParticipantFactory单例上的get_default_participant_qos()成员函数返回的值。PARTICIPANT_QOS_DEFAULT是一个DomainParticipantQos的常亮对象,可作为create_participant()或DomainParticipant::set_qos()成员函数的QoS参数,表示使用当前默认的DomainParticipantQos。默认的DomainParticipantQos可以在任何时候使用DomainParticipantFactory单例上的set_default_participant_qos()成员函数进行修改。修改默认的DomainParticipantQos不会影响已经存在的DomainParticipant实例。
PARTICIPANT_QOS_DEFAULT在不同地方有不同意思,在create_participant()和DomainParticipant::set_qos()上,它引用由get_default_participant_qos()返回的默认DomainParticipantQos。 在set_default_participant_qos()上,它引用默认构造的DomainParticipantQos()。

DomainParticipantListener

DomainParticipantListener是一个抽象类,定义了将在响应DomainParticipant上的状态更改时触发的回调。默认情况下,所有这些回调函数都是空的,不做任何事情。用户特化该类,重写应用程序上需要的回调。未被覆盖的回调将维护它们的空实现。
DomainParticipantListener继承自TopicListener、PublisherListener和SubscriberListener。因此,它有能力对通知给任何附加实体的任何类型的事件做出反应。由于事件总是被通知给能够处理事件的最特定的实体侦听器,因此DomainParticipantListener从其他侦听器继承的回调只有在没有其他实体能够处理事件时才会被调用,要么是因为它没有附加侦听器,要么是因为实体上的StatusMask禁用了回调。此外,DomainParticipantListener还有以下回调:
1.on_participant_discovery() :在同一域中发现了新的DomainParticipant,或者是以前已知的DomainParticipant已被删除的,或者某些DomainParticipant更改了其QoS的,会调用这个回调。此方法提供了一个带有额外布尔输出参数的重载,从而发现回调可以通过使用ignore_participant()告诉中间件是否必须忽略新发现的参与者。当需要忽略发现回调中的参与者时,应该使用此重载,因为在侦听器中调用ignore_participant()可能会死锁。
2.on_subscriber_discovery() :在同一Domain发现了新的Subscriber,或者是已知的又被删除了的Subscriber,又或者更改了QoS的Subscriber。
3.on_publisher_discovery():在同一Domain发现了新的Publisher,或者是已知的又被删除了的Publisher,又或者更改了QoS的Publisher。
4.on_type_discovery():在同一Domain发现新的数据类型。
5.on_type_dependencies_reply():类型查找客户端接收到一个getTypeDependencies()请求,此回调可用于使用getTypes()请求检索新类型,并使用检索的类型对象创建新的动态类型。
6.on_type_information_received():从新发现的DomainParticipant接收到新的TypeInformation。
7.onParticipantAuthentication():通知远端DomainParticipant认证过程的结果(失败或成功)。

DomainParticipantFactory

这个类的唯一目的是允许创建和销毁DomainParticipant对象。DomainParticipantFactory本身没有工厂,它是一个单例对象,可以通过DomainParticipantFactory类上的get_instance()静态成员函数访问。DomainParticipantFactory的行为可以使用DomainParticipantFactoryQos上指定的QoS值进行修改。由于DomainParticipantFactory是一个单例,它的QoS只能通过DomainParticipantFactory::set_qos()成员函数修改。DomainParticipantFactory不接受任何监听器,因为它不是一个实体。
DomainParticipantFactoryQos控制DomainParticipantFactory的行为。在内部它包含以下QosPolicy对象:
在这里插入图片描述

DomainParticipant创建删除

DomainParticipant的创建是通过DomainParticipantFactory单例上的create_participant()成员函数完成的,它充当DomainParticipant的工厂。
DomainParticipant* create_participant(DomainId_t domain_id,const DomainParticipantQos& qos,DomainParticipantListener* listener = nullptr,const StatusMask& mask = StatusMask::all())

// Create a DomainParticipant with default DomainParticipantQos and no Listener
// The value PARTICIPANT_QOS_DEFAULT is used to denote the default QoS.
DomainParticipant* participant_with_default_attributes =
        DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT);
if (nullptr == participant_with_default_attributes)
{
    // Error
    return;
}

// A custom DomainParticipantQos can be provided to the creation method
DomainParticipantQos custom_qos;

// Modify QoS attributes
// (...)

DomainParticipant* participant_with_custom_qos =
        DomainParticipantFactory::get_instance()->create_participant(0, custom_qos);
if (nullptr == participant_with_custom_qos)
{
    // Error
    return;
}

// Create a DomainParticipant with default QoS and a custom Listener.
// CustomDomainParticipantListener inherits from DomainParticipantListener.
// The value PARTICIPANT_QOS_DEFAULT is used to denote the default QoS.
CustomDomainParticipantListener custom_listener;
DomainParticipant* participant_with_default_qos_and_custom_listener =
        DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT,
                &custom_listener);
if (nullptr == participant_with_default_qos_and_custom_listener)
{
    // Error
    return;
}

DomainParticipant的删除需要使用DomainParticipantFactory单例上的delete_participant()成员函数。

// Create a DomainParticipant
DomainParticipant* participant =
        DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT);
if (nullptr == participant)
{
    // Error
    return;
}

// Use the DomainParticipant to communicate
// (...)

// Delete entities created by the DomainParticipant
if (participant->delete_contained_entities() != ReturnCode_t::RETCODE_OK)
{
    // DomainParticipant failed to delete the entities it created.
    return;
}

// Delete the DomainParticipant
if (DomainParticipantFactory::get_instance()->delete_participant(participant) != ReturnCode_t::RETCODE_OK)
{
    // Error
    return;
}

Partitions

分区在domain引起的隔离中引入了逻辑实体隔离级别概念。它们代表了域名和主题之外的另一个层次,将发布者和订阅者分开。要使发布服务器与订阅服务器通信,它们必须至少属于一个公共分区。从这个意义上说,分区代表了一种轻量级机制,可以在端点之间提供数据分离:
1.与Domain和Topic不同的是,分区可以在端点的生命周期内以很小的代价动态更改。具体来说,没有启动新的线程,没有分配新的内存,并且更改历史不受影响。注意,修改端点的Partition成员资格将触发宣布新的QoS配置,因此可能会出现新的端点匹配,这取决于新的Partition配置。由于远程端点的匹配,内存分配和运行线程可能会发生变化;
2.与Domain和Topic不同,一个端点可以同时属于几个分区。为了在不同的Topic上共享某些数据,每个Topic必须有不同的Publisher,每个Publisher共享自己的更改历史。另一方面,单个发布者可以使用单个主题数据更改在不同分区上共享相同的数据,从而减少网络过载。

端点的Partition成员关系可以在PublisherQos或SubscriberQos对象的PartitionQosPolicy数据成员上配置。该成员保存了一个分区名称字符串列表。如果没有为一个实体定义分区,它将自动包含在默认的无名称分区中。因此,没有指定分区的发布服务器和订阅服务器仍然可以通过默认的无名称分区进行通信。

分区名称条目可以具有通配符,遵循POSIX fnmatch API(1003.2-1992节B.6)定义的命名约定。带有通配符的条目可以匹配多个名称,允许一个端点轻松地包含在多个分区中。两个带通配符的分区名称将匹配,如果其中一个根据fnmatch匹配另一个。也就是说,以两种方式检查匹配。

//节点加入到两个分区
PublisherQos pub_11_qos;
pub_11_qos.partition().push_back("Partition_1");
pub_11_qos.partition().push_back("Partition_2");
//节点加入到所有分区
PublisherQos pub_12_qos;
pub_12_qos.partition().push_back("*");
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值