本文为您介绍使用v1.x.x版本的C++ SDK接入消息队列RocketMQ版所需完成的准备工作、使用说明以及注意事项,以便后续使用C++ SDK收发消息。

使用前,请注意以下几点:

  • 本文仅针对C++ SDK v1.x.x版本进行说明,若需使用v2.0.0版本的SDK,可选择环境准备(v2.0.0)直接下载。v2.0.0版本的SDK使用说明请参见环境准备(v2.0.0)
  • 代码里涉及到的Topic和Group ID,需要到控制台上创建。Message Tag可以完全由应用自定义,具体创建过程请参见创建资源
  • 使用消息队列RocketMQ版服务的应用程序需要部署在阿里云ECS上。

SDK下载

C++ SDK支持Windows和Linux两个操作系统,而且接口完全一致。Linux下支持CentOS 6(RHEL 6)和CentOS 7(RHEL 7)系列。C++ SDK的下载链接,请参见版本说明

下载完成后进行解压,会有如下目录结构,各目录的说明如下:

  • demo/(只针对Windows系统)

    包含了一个创建好的Windows C++ 演示Demo。

  • example/

    包含了普通消息发送、Oneway消息发送、顺序消息发送、普通消息消费、顺序消息消费等例子,Linux下还包含了Makefile用于example的编译和管理。

  • include/

    包含了用户自己编写的程序需要的头文件。

  • lib/
    • Linux SDK子目录如下,分别是64的静态库和动态库。
      lib-boost-share/
        libonsclient4cpp.so
      lib-boost-static/
        libonsclient4cpp.a                        
    • Windows SDK子目录如下,是64位系统下SDK的dll库。如果没有安装Visual Studio 2015环境下,需要拷贝安装vc_redist.x64。 这是Visual C++ 2015的运行时环境。
      64/
      vc_redist.x64                        
  • SDK_GUIDE.pdf

    SDK环境准备文档和FAQ。

  • changelog

    新版本发布解决的问题和引入的新特性列表。

Linux C++ SDK

自2016年12月02日开始,Linux CPP版本依赖了高性能boost库(1.62.0版本),不仅降低了CPU资源占用率,而且提高了运行效率。目前主要依赖了boost_systemboost_threadboost_chronoboost_filesystem四个库,有静态库和动态库两种解决方案。

静态解决方案

消息队列RocketMQ版的库文件在lib/lib-boost-static目录下,boost库静态链接到libonsclient4cpp.a中。对于没有依赖boost库的业务方,可以直接选用静态库方案。静态库方案中,相应的boost库已经链接到libonsclient4cpp.a,编译时只需要链接libonsclient4cpp.a即可,无需执行其他操作。使用方式如下。

cd aliyun-mq-linux-cpp-sdk  //下载的SDK解压后的路径
cd example                  //进入example目录,修改example文件,填入您创建的Topic和Key等相关的信息
make static=1            
注意 完全的静态链接请确保机器上安装了libstdc++、pthread等相关的静态库。默认安装的libstdc++ 是没有安装静态库的,所以需要通过yum或者> apt-get来安装相关的静态库。

此外使用如上方式会出现一些警告信息如下。

warning: Using 'gethostbyaddr' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking            

建议最佳的方式,不要使用完全的静态链接,而是只静态链接onsclient4cpp,其他库动态链接即可。使用方式如下。

g++ -ggdb -Wall -O3 -I../include    ../example/ProducerExampleForEx.cpp  -Wl,-static -lonsclient4cpp -L../lib/lib-boost-static/ -Wl,-Bdynamic  -lpthread -ldl -lrt -o ../example/ProducerExampleForEx        

此外,由于GCC 5.x引入Dual ABI,编译链接时,请添加-D_GLIBCXX_USE_CXX11_ABI=0编译选项。

动态解决方案

消息队列RocketMQ版的库文件在lib/lib-boost-share目录下,需要业务方生成可执行文件时链接boost动态库和libonsclient4cpp.so。对于业务方已经依赖了boost库,需要选择动态库方案的情况,对boost库的依赖需要做如下工作:

  1. 下载boost 1.62.0版本。

    boost 1.62.0

  2. 解压boost 1.62.0。

    tar --bzip2 -xf /path/to/boost_1_62_0.tar.bz2

  3. 安装boost 1.62.0版本:
    1. 进入boost 1.62.0解压后的路径:cd path/to/boost_1_62_0
    2. 配置boost:./bootstrap.sh
    3. 编译boost: ./b2 link=shared runtime-link=shared
    4. 安装boost: ./b2 install
  4. 执行ldconfig -v|grep libboost。如果有相关的输出,则表明boost动态库在动态库搜索路径中。
  5. 生成可执行文件时,需要链接boost动态库和消息队列RocketMQ版的动态库。方法如下。
    cd aliyun-mq-linux-cpp-sdk  //下载的SDK解压后的路径
    cd example                  //进入example目录,修改example文件,填入自己在消息队列RocketMQ版控制台创建的Topic和Key等相关的信息
    g++ -Wall -Wno-deprecated -L ../lib/lib-boost-share/ -I ../include/ ProducerExampleForEx.cpp  -lonsclient4cpp -lboost_system -lboost_thread -lboost_chrono -lboost_filesystem -lpthread
    export LD_LIBRARY_PATH="../lib/lib-boost-share/"  //添加动态载入的搜索路径
    ./a.out  //运行程序

Windows C++ SDK

Visual Studio 2015环境下使用C++ SDK

  1. 使用Visual Studio 2015创建自己的项目。createprojectnextfinish
  2. 右键单击项目,选择属性 > 配置管理器,设置活动解决方案配置为release,设置活动解决方案平台为x64x64CM
  3. 右键单击项目,依次选择属性 > 配置属性 > 常规 > 输出目录/A。按照活动解决方案平台的设置,拷贝64位lib目录下的所有文件到输出目录/Aoutputdirectory
  4. 右键单击项目,依次选择属性 > 配置属性 > C/C++-常规 > 附加包含目录/B。 拷贝include目录下的头文件到包含目录: /Botherdirectoryadditional
  5. 右键单击项目,依次选择属性 > 配置属性 > 链接 > 常规 > 附加库目录/AadditionalA
  6. 右键单击项目,依次选择属性 > 配置属性 > 链接 > 输入 > 附加依赖项ONSClient4CPP.libONSClient4CPP.lib
  7. 右键单击项目,依次选择属性 > 配置属性 > C/C++-常规 > 预处理器定义: 添加WIN32宏。WIN32

Visual Studio非2015环境下使用C++ SDK

  1. 首先需要按照Visual Studio 2015的环境来配置,配置过程同Visual Studio 2015环境下使用C++ SDK。
  2. 安装vc_redist.x64。这是Visual C++ 2015的运行时环境。
    注意 如果不想进行繁琐的设置,您也可以使用设置好的SDK Demo,下载SDK后进行解压,然后进入demo目录,使用Visual Studio 2015打开工程。

    示例如下:

    demopropertiessetfilepath

    到此为此就设置好编译环境了。单击Build,即可编译出可执行的程序,然后拷贝dll到可执行程序的目录下即可运行,或者拷贝dll到系统目录下。

升级v1.x.x版本的SDK至v2.0.0

目前最新版的v2.0.0 SDK和v1.x.x SDK保持API向前兼容(即新版本兼容旧版本),由于实现方式不同,ABI是不兼容的。

请按照以下步骤升级:

  1. 将新版SDK的头文件替换老版本的头文件。
  2. 将新版本lib目录下的动态库全部拷贝到存放原版本动态库的目录下。
  3. 如果之前使用的是静态链接方案,去掉-static参数,修改为默认动态路链接方案。
  4. 修改编译脚本,增加-lrocketmq_client_core参数,链接新版内核动态库。
  5. 重新编译工程。
  6. 若升级失败,则可选择回退,将工程恢复至升级前状态,重新编译即可。

更多信息