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

麒麟V10 SP1 + Qt + Qpid Proton 连接 Apache Artemis 实战指南

麒麟V10 SP1 + Qt + Qpid Proton 连接 Apache Artemis 实战指南

一、背景

在企业级消息中间件场景中,Apache Artemis 作为高性能、多协议的 ActiveMQ 替代品,广泛用于生产环境。然而,在国产操作系统麒麟 V10 SP1 上,使用 Qt 框架通过 AMQP 1.0 协议连接 Artemis 却有不少坑。本文记录了从零开始搭建 Qt 项目、集成 Qpid Proton 库、解决各种编译和运行时错误的完整过程。

二、环境概览

  • 操作系统:麒麟 V10 SP1(基于 Debian/Ubuntu)
  • Qt 版本:5.12 / 5.15(通过 apt 安装)
  • 编译器:GCC(系统自带)
  • 目标 Broker:Apache Artemis 2.53.0(AMQP 1.0 端口 5672)
  • 客户端库:Qpid Proton 0.22.0(C++ 绑定)

三、安装 Qpid Proton 库

麒麟 V10 的 apt 源中包含libqpid-proton-cpp12-devlibqpid-proton11-dev,直接安装即可:

sudoaptupdatesudoaptinstall-ylibqpid-proton-cpp12-dev libqpid-proton11-dev

验证安装:

# 头文件应在 /usr/include/proton/ls/usr/include/proton/messaging_handler.hpp# 库文件应在 /usr/lib/x86_64-linux-gnu/ls/usr/lib/x86_64-linux-gnu/libqpid-proton-cpp.so

注意:某些情况下.so符号链接可能缺失,需要手动创建:

sudoln-sf/usr/lib/x86_64-linux-gnu/libqpid-proton-cpp.so.12\/usr/local/lib/libqpid-proton-cpp.sosudoln-sf/usr/lib/x86_64-linux-gnu/libqpid-proton.so.11\/usr/local/lib/libqpid-proton.sosudoldconfig

四、Qt 项目配置

4.1 创建项目

在 Qt Creator 中选择“Qt Widgets Application”,取消勾选“Create form”(不使用 .ui 文件)。项目名称为ArtemisClient

4.2.pro文件

QT += core gui network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = ArtemisClient CONFIG += c++11 # Proton 库路径 INCLUDEPATH += /usr/include LIBS += -L/usr/lib/x86_64-linux-gnu LIBS += -lqpid-proton-cpp -lqpid-proton -lssl -lcrypto -lpthread # 运行时 RPATH(防止加载不到 .so) QMAKE_RPATHLINKDIR *= /usr/lib/x86_64-linux-gnu SOURCES += \ amqpworker.cpp \ main.cpp \ mainwindow.cpp HEADERS += \ amqpworker.h \ mainwindow.h

五、核心代码实现

5.1 AMQP Worker 类 (amqpworker.h/amqpworker.cpp)

由于 Qpid Proton 0.22 的 API 与高版本有所不同,需特别注意以下几点:

  • 使用proton::container::connect()建立连接,再通过connection.open_sender()/open_receiver()创建链路。
  • 连接选项通过proton::connection_options设置,并通过connect()传入。
  • 消息体解码时,判断v.type() == proton::STRINGproton::BINARY

amqpworker.h(仅声明,不包含 Proton 头文件):

#ifndefAMQPWORKER_H#defineAMQPWORKER_H#include<QObject>#include<QString>classAmqpWorker:publicQObject{Q_OBJECTpublic:explicitAmqpWorker(constQString&connUrl,constQString&address,constQString&user,constQString&pass,QObject*parent=nullptr);~AmqpWorker();publicslots:voidstartContainer();voidrequestStop();voidsendMessage(constQString&body);signals:voidconnected();voiddisconnected();voidmessageReceived(constQString&from,constQString&body);voiderrorOccurred(constQString&err);voidlog(constQString&txt);private:classImpl;Impl*d;};#endif// AMQPWORKER_H

amqpworker.cpp(包含 Proton 头文件):

#include"amqpworker.h"#include<proton/messaging_handler.hpp>#include<proton/container.hpp>#include<proton/connection.hpp>#include<proton/connection_options.hpp>#include<proton/sender.hpp>#include<proton/receiver.hpp>#include<proton/message.hpp>#include<proton/delivery.hpp>#include<proton/url.hpp>#include<thread>#include<atomic>classAmqpWorker::Impl:publicQObject,publicproton::messaging_handler{Q_OBJECTpublic:Impl(conststd::string&url,conststd::string&addr,conststd::string&user,conststd::string&pass):m_url(url),m_addr(addr),m_user(user),m_pass(pass){}voidon_container_start(proton::container&c)override{emitlog("🚀 Container starting...");proton::connection_options opts;if(!m_user.empty()){opts.user(m_user);opts.password(m_pass)
http://www.cnnetsun.cn/news/2928112.html

相关文章:

  • 签到题【牛客tracker 每日一题】
  • AD5761R菊花链应用避坑指南:LDAC引脚用法、SPI时序与数据错位问题全解析
  • 新PM上任第一课:避开这5个质量策划“天坑”,用MSD和FP流程稳住项目基本盘
  • CC switch + codex 401问题修复
  • GCP上机器学习模型生产部署的四大生命线实践
  • Ubuntu 24.04桌面迁移实战:30天Windows替代全记录
  • Scikit-learn RidgeCV 报错怎么办?教你一招避坑
  • 非科班转码面华为:我的项目经历如何撑起了三轮技术面?
  • 千问怎么领取8元立减券,输入 新用户福利020738
  • 别再卡成PPT了!手把手教你解决VMware虚拟机跑Gazebo仿真帧率低的终极方案
  • 【Springboot毕设全套源码+文档】基于Java+springboot在线书籍商城系统的设计和开发(丰富项目+远程调试+讲解+定制)
  • Labelimg画框闪退?别急着重装!一个Python版本引发的‘血案’与精准修复指南
  • 避坑指南:在树莓派Pico上用MicroPython播放SD卡里的WAV音频,SPI和I2S配置这些细节别踩雷
  • 小红书品牌合作笔记被下架?SENTINEL-6H申诉攻略
  • 告别IntelliJ IDEA Python运行报错:手把手教你重建.iml文件与修复Module依赖
  • 告别设计盲区:一招搞定PowerDesigner物理模型表的注释同步与展示
  • 飞凌RK3568开发板Qt应用开发入门:从源码编译到‘Hello Qt’上板运行全记录
  • pandas多维聚合实战:从groupby到滚动窗口的工程化落地
  • Rust内存模型入门:所有权、借用与生命周期三权分立
  • 别再让Segmentation Fault折磨你:用GDB和Valgrind快速定位C/C++内存访问错误
  • 不只是Resize和Crop:用PyTorch transforms构建一个‘防呆’图像预处理流水线
  • VCSA 6.7证书过期别慌!手把手教你修改系统时间+续订证书(附STS证书修复脚本)
  • 别再让BrokenPipeError打断你的爬虫:requests和aiohttp库中的连接保持与异常处理实战
  • 别再只改后缀了!用Burp Suite实战iwebsec靶场03关,手把手教你Content-Type绕过(附四种MIME类型修改技巧)
  • 避开这些坑!Multisim仿真组合逻辑电路(编码器/译码器/数据选择器)的5个常见错误与调试指南
  • 云原生时代下的后端开发:技术趋势与最佳实践
  • VMvare 安装 Linux CentOS 7
  • Elasticsearch入门核心:倒排索引、文档映射与分片机制详解
  • 手把手教你:在老旧CentOS 7上为llama.cpp量化搞定GCC 9.3(附完整避坑清单)
  • ArcGIS生态学家的救星:手把手解决Linkage Mapper 3.0安装与运行中的20+常见报错