c++ OpenDDS和发布者存在通知

blmhpbnm  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(192)

问题:如何获取展位发布者连接和断开连接的活动通知?
背景:我正在处理一个OpenDDS实现,其中我有一个数据类型(dt)的发布者和订阅者,使用同一个主题,位于不同的计算机上。
订阅服务器端的读取器重写了on_data_available(...)on_liveliness_changed(...)的实现。我的订阅服务器首先启动,导致对on_liveliness_changed(...)的回调,该回调指出没有可用的编写器。当发布服务器启动时,我得到一个新的回调,该回调告诉我有可用的编写器,当发布服务器发布时,on_data_available(...)被调用,到目前为止一切都按预期工作。
发布服务器上的编写器具有on_publication_matched(...)的重写实现。启动发布服务器时,将调用on_publication_matched(...),因为我们已经启动了订阅服务器。
问题是,当发布者断开连接时,我在读取器端没有得到对on_liveliness_changed(...)的回调,当发布者再次启动时,我也没有得到新的回调。
我曾尝试通过设置readerQos.liveliness.lease_duration来更改readerQos,但结果是on_data_available(...)永远不会被调用,并且对on_liveliness_changed(...)的唯一回调是在启动时,告诉我没有发布者。

DDS::DataReaderQos readerQos;
DDS::StatusKind mask = DDS::DATA_AVAILABLE_STATUS | DDS::LIVELINESS_CHANGED_STATUS |  DDS::LIVELINESS_LOST_STATUS ; 
m_subscriber->get_default_datareader_qos( readerQos );
DDS::Duration_t t = { 3, 0 };
readerQos.liveliness.lease_duration = t;
m_binary_Reader = static_cast<binary::binary_tdatareader( m_subscriber->create_datareader(m_Sender_Topic,readerQos,this, mask, 0, false) );

/克里斯托弗

dldeef67

dldeef671#

好吧,我猜这里没有多少DDS用户。
经过一番研究,我发现只有满足以下兼容性标准时,才会发生读取器/写入器匹配:提供的租用持续时间〈=请求的租用持续时间
解决方案是设置writer QoS以提供相同的活动性。可能有一种方法可以检查所请求的reader QoS是否可以由相应的writer提供,如果不能,则使用"较低"的QoS,尽管我还没有尝试过。
在on_liveliness_changed回调方法中,我只是根据LivelinessChangedStatus计算了中的alive_count。
/克里斯托弗

相关问题