当前位置: 首页 > news >正文

opendds初入门之对inforepo模式运行探索

opendds的集中模式inforepo一般是在主线程中运行,直接run进行阻塞等待,内部有一系列的资源初始化以及ace和tao的相关底层资源。

业务探索,需要把inforepo的集中模式和UI界面进行配合使用,也就是说ui是主进程,而inforepo需要移到子线程中处理。

补充:opendds下的项目,每个项目下都自带一个可执行脚本run_test.pl,对于测试样例,可以在对应项目生成可执行文件目录下执行perl run_test.pl进行运行演示,观察现象。

C:\Users\LEGION\Desktop\opendds_study\OpenDDS\DevGuideExamples\DCPS\Messenger>perl run_test.pl
C:\Users\LEGION\Desktop\opendds_study\OpenDDS\bin\.\DCPSInfoRepo.EXE -ORBDebugLevel 1 -ORBLogFile DCPSInfoRepo.log -o repo.ior -DCPSPendingTimeout 3
InfoRepo PID: 24272
.\.\subscriber.EXE  -ORBDebugLevel 1 -DCPSDebugLevel 4 -ORBVerboseLogging 1 -DCPSTransportDebugLevel 2 -ORBLogFile subscriber.log -DCPSPendingTimeout 3
subscriber PID: 25360 started at 2025-07-09 17:36:59
.\.\publisher.EXE  -ORBDebugLevel 1 -DCPSDebugLevel 4 -ORBVerboseLogging 1 -DCPSTransportDebugLevel 2 -ORBLogFile publisher.log -DCPSPendingTimeout 3

说明:本次是在理解不完善的角度上考虑实现方案的探索。

1:首先了解一下inforepo的作用,主观理解,还未验证。

这里并不是以tcp的交互方式,而是基于tcp的corba,待实际确定!
在这里插入图片描述

2:基于现有主进程的方式,首先进行测试一下相关集中模式的发布订阅。

#基于源代码编译后的产物,内部有demo 可以查看验证结果
#执行 perl run_test.pl  可以直接运行,也可以看到内部自带调用指令。
C:\Users\LEGION\Desktop\opendds_study\OpenDDS\bin\.\DCPSInfoRepo.EXE -ORBDebugLevel 1 -ORBLogFile DCPSInfoRepo.log -o repo.ior -DCPSPendingTimeout 3

同时,这个脚本,也是一个很好的命令指令样本。

C:\Users\LEGION\Desktop\opendds_study\OpenDDS\bin\.\DCPSInfoRepo.EXE -ORBDebugLevel 1 -ORBLogFile DCPSInfoRepo.log -o repo.ior -DCPSPendingTimeout 3
.\.\subscriber.EXE  -ORBDebugLevel 1 -DCPSDebugLevel 4 -ORBVerboseLogging 1 -DCPSTransportDebugLevel 2 -ORBLogFile subscriber.log -DCPSPendingTimeout 3
.\.\publisher.EXE  -ORBDebugLevel 1 -DCPSDebugLevel 4 -ORBVerboseLogging 1 -DCPSTransportDebugLevel 2 -ORBLogFile publisher.log -DCPSPendingTimeout 3

可以写入日志进行查看日志,确定一些必要信息。

C:\Users\LEGION\Desktop\opendds_study\OpenDDS\bin\.\DCPSInfoRepo.EXE  -ORBListenEndpoints iiop://127.0.0.1:12345subscriber.EXE -DCPSInfoRepo iiop://127.0.0.1:12345 -ORBDebugLevel 1 -DCPSDebugLevel 4 -ORBVerboseLogging 1 -DCPSTransportDebugLevel 2 -ORBLogFile subscriber.log -DCPSPendingTimeout 3
publisher.EXE  -DCPSInfoRepo iiop://127.0.0.1:12345 -ORBDebugLevel 1 -DCPSDebugLevel 4 -ORBVerboseLogging 1 -DCPSTransportDebugLevel 2 -ORBLogFile publisher.log -DCPSPendingTimeout 3

最后,依赖操作系统自动分配节点的时候,可能发现和中心节点网络交互问题,主机可能多个ip吧。

所以,手动指定客户端ip进行跨主机测试。

#在pub和sub运行时加参数  
-DCPSDefaultAddress 192.168.1.161:3333

看到一个差异,集中节点的配置如下两种,有什么区别?

-DCPSInfoRepo corbaloc::192.168.1.161:12345/DCPSInfoRepo 和-DCPSInfoRepo iiop://127.0.0.1:12345有什么区别

corbaloc::192.168.1.161:12345/DCPSInfoRepo    是CORBA对象的“定位名称”,明确指定了对象名称,连接可靠,生产环境推荐。
iiop://127.0.0.1:12345                        CORBA的iiop:地址(这是ACE/TAO特定的URL格式),仅指定了IIOP协议下的主机和端口,但没有指定对象名称缺少对象名,依赖默认绑定,可能失败或不确定。 推荐本地测试用。

3:考虑在子线程中运行测试。

核心目的是期望Inforepo的线程和主线程UI界面共存。

这里首先测试在子线程中要启动运行正常。

//这里注意,InfoRepo的启动依赖主线程还是底层的一些资源,最终是ACE_OS::thr_self();和CORBA::ORB_init(argc, argv);加上后处理正常。
//这里注意,函数内定义的线程的局部变量,在不加detach()或者join时,线程出作用域释放,会导致崩溃问题。
#include "DCPSInfoRepoServ.h"#ifdef ACE_AS_STATIC_LIBS
#  include <dds/DCPS/InfoRepoDiscovery/InfoRepoDiscovery.h>
#endif#include <iostream>
#include <thread>
int
ACE_TMAIN(int argc, ACE_TCHAR *argv[])
{std::vector<std::string> args = {"InfoRepoService","-ORBListenEndpoints", "iiop://192.168.1.161:12345"};try {std::thread t([args]() {ACE_OS::thr_self();std::vector<char*> argv_vec;for (auto& s : args)argv_vec.push_back(const_cast<char*>(s.c_str()));int argc = argv_vec.size();char** argv = argv_vec.data();CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);if (!CORBA::is_nil(orb)) {std::cout << "[INFO] ORB_init() 成功" << std::endl;}else {std::cerr << "[ERROR] ORB_init() 返回空对象(CORBA::is_nil)" << std::endl;}// 你也可以测试 resolve_initial_references 是否能继续工作CORBA::Object_var poa_obj = orb->resolve_initial_references("RootPOA");if (!CORBA::is_nil(poa_obj)) {std::cout << "[INFO] RootPOA resolved 成功" << std::endl;}else {std::cerr << "[ERROR] 无法 resolve RootPOA" << std::endl;}InfoRepo infoRepo(argc, argv);//这里是为了接受终端上的一些退出信号做处理吗?InfoRepo_Shutdown ir_shutdown(infoRepo);Service_Shutdown service_shutdown(ir_shutdown);std::cout << "infoRepo has run start.";infoRepo.run();std::cout << "infoRepo has run end.";orb->destroy();});t.join();}catch (InfoRepo::InitError& ex) {std::cerr << "Unexpected initialization Error: "<< ex.msg_ << std::endl;return 1;}catch (const CORBA::Exception& ex) {ex._tao_print_exception("ERROR: DDS DCPS Info Repo caught exception");return 1;}return 0;
}

4:考虑停止的逻辑。

基于UI界面的操作,类似上面的逻辑可以通过控件控制启动。

本来设想的是,基于Inforepo的特性,他需要持久化运行,不应该被停止,因为停止后丢失了先前的发布订阅信息。

但是,领导要求停止,所以考虑一下停止的方案。

在这里插入图片描述

所以本身让inforepo停止是不合理的,如果要停止,需要做持久化或者其他方案支持。

但是基于技术的角度,尝试使用停止的测试方案。

在这里插入图片描述

可探索,基于inforepo集中模式ior,可以考虑配合imr,iogr,以及inforepo联邦进行业务部署。

http://www.dtcms.com/a/411292.html

相关文章:

  • 简单公司网站最全的域名后缀
  • 比邻智联发布生活物联网家电应用白皮书和Cat.1模组新品
  • 第七章 Spring-Boot框架
  • 网站html静态化解决方案网站制作公司 北京
  • 金仓数据库实现电子证照系统从MongoDB平滑迁移,国产化替代迎来新典范
  • CAN总线学习(四)错误处理 STM32CAN外设一
  • 【OpenGL】LearnOpenGL学习笔记28 - 延迟渲染 Deferred Rendering
  • 莱芜梆子网站昆山网站建设需要多少钱
  • 站长交流装潢设计什么意思
  • web核心—HTTP
  • 线程池导入大数据量excel
  • Spring Boot 3.x + Security + OpenFeign:如何避免内部服务调用被重复拦截?
  • 全国免费发布信息网站大全wordpress 修改文章id
  • 公司网站设计费计入什么科目app科技网站建设
  • 从需求到实现:如何解决证件照标准化难题的?
  • C++第九篇:friend友元
  • 软件工程咋理解?用 “开奶茶店” 讲透瀑布模型 / 敏捷开发
  • 如何在WordPress中添加短代码
  • 资源型网站建设 需要多大硬盘招牌设计 创意logo
  • 数据库索引简介
  • 基于三角测量拓扑聚合优化的LSTM深度学习网络模型(TTAO-LSTM)的一维时间序列预测算法matlab仿真
  • 关键词网站查询产品展示网站源码php
  • TOGAF ® 标准与循环经济:为可持续与责任型 IT 而设计
  • C盘内存不足,清除或转移VS2022缓存文件Cache
  • 玉米病叶识别数据集,可识别褐斑,玉米锈病,玉米黑粉病,霜霉病,灰叶斑点,叶枯病等,使用yolo,coco,voc对4924张照片进行标注
  • 修改Linux上的ssh的默认端口号——及其客户端使用ssh连接不上Linux问题排查解决
  • 连接世界:网络请求 `wx.request`
  • 安徽省建设厅网站打不开批量导文章到wordpress
  • 用一个OneKey MCP把付费的AI Agent MCP的价格打下来 - DeepNLP OneKey MCP Agent Router项目
  • 绿算技术与清智图灵完成产品兼容性互认证