C++写windows端rabbitmq客户端

RabbitMQ 的介绍可以到官网查询,这里就不写了。附上官网地址:https://www.rabbitmq.com/getstarted.html

RabbitMQ简介

  1. 可靠性(Reliability):RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
  2. 灵活的路由(Flexible Routing):在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。
  3. 消息集群(Clustering):多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。
  4. 高可用(Highly Available Queues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
  5. 多种协议(Multi-protocol):RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。
  6. 多语言客户端(Many Clients):RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。
  7. 管理界面(Management UI):RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。
  8. 跟踪机制(Tracing):如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。
  9. 插件机制(Plugin System):RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。

上面简介摘自作者:FelixCoder
链接:https://www.jianshu.com/p/e66849f17c36

序言

  RabbitMQ官网并没有C或C++写的例子,关于在windows端写C++的RabbitMQ客户端的代码网上也有很多,但是对于新手不是很友好,有的例子只能在linux系统才能编译的,还有些写得云里雾里的根本不知道怎么来的又怎么去的。所以作为开荒者,我想写得更详细些,可以帮助有需要的朋友。

 

目标

win32的RabbitMQ 客户端发送跟接收功能

 

开发环境与工具

windows 10

visual studio 2019

cmake 3.16.0

https://cmake.org/download/

vcpkg 2019.09.12

RabbitMQ 服务端windows版

https://www.rabbitmq.com/download.html

 

上面这些工具是要用到的,不知道是什么可以上百度找一下。

 

前期准备

(1)RabbitMQ 服务端windows版安装

RabbitMQ是要依赖Erlang的,安装之前先装Erlang。

Erlang官网http://www.erlang.org/downloads

官网http://www.rabbitmq.com/

工程使用的版本是otp_win64_22.1 跟rabbitmq-server-3.8.1。如果发现版本不兼容,可以尝试装这两个版本。

安装完之后可通过访问 http://localhost:15672 进行测试,默认登录账户为:guest / guest

如果浏览器打不开,是因为默认没有使用管理模块的插件,只需在cmd命令窗口开启相应的插件即可。

cmd进入RabbitMQ安装目录的sbin目录下,执行下面两条命令:

# 开启RabbitMQ节点
rabbitmqctl start_app
# 开启RabbitMQ管理模块的插件,并配置到RabbitMQ节点上
rabbitmq-plugins enable rabbitmq_management

 

如果有需要关闭RabbitMQ节点,可以使用下面的命令:
rabbitmqctl stop

 

(2)RabbitMQ-c安装

拉取RabbitMQ-c源码:https://github.com/alanxz/rabbitmq-c.git

然后打开cmake软件,构建VS工程文件。

C++写windows端rabbitmq客户端_第1张图片

注意取消勾选ENABLE_SSL_SUPPORT,然后依次点击下面的按钮

C++写windows端rabbitmq客户端_第2张图片

点击configure按钮,我测试生成的是VS2019工程,32位程序

C++写windows端rabbitmq客户端_第3张图片

如果要修改生成配置,可以点击File->Delete Cache

C++写windows端rabbitmq客户端_第4张图片

生成成功之后在输出文件夹就可以看到我们的VS代码

C++写windows端rabbitmq客户端_第5张图片

直接双击.sln文件就可以用VS打开工程源码。

我们build的是Release,32位程序,选中根项目右键生成

C++写windows端rabbitmq客户端_第6张图片

在生成目录下面就可以看到生成的库文件

C++写windows端rabbitmq客户端_第7张图片

(3)RabbitMQ-c封装库SimpleAmqpClient安装

1、需要依赖的库有:

boost-1.47.0 or newer (uses chrono, system internally in addition to other header based libraries such as sharedptr and noncopyable)
rabbitmq-c you'll need version 0.5.1 or better.
cmake 2.8+ what is needed for the build system
Doxygen OPTIONAL only necessary to generate API documentation(可不用,用来生成文档)

安装boost有点麻烦,这时候vcpkg就可以派上用场了,直接命令vcpkg install boost 自动编译成32位文件,省去很多麻烦,你也可以直接下载boost的源码自己编译。

boost的源码:https://sourceforge.net/projects/boost/files/boost-binaries/

2、boost编译完成之后就可以编译SimpleAmqpClient的源码,我们如法炮制使用cmake生成VS工程文件。

SimpleAmqpClient源码地址:https://github.com/alanxz/SimpleAmqpClient

下载完成我们需要编译SimpleAmqpClient.2.dll跟SimpleAmqpClient.2.lib文件

但是编译过程就没那么顺利了,这里我们要在cmake软件中设置我们的boost跟rabbitmq的库文件夹

C++写windows端rabbitmq客户端_第8张图片

注意我使用的是vcpkg安装boost跟rabbitmq的,目录可以看下面的图片,如果是自己下载源码编译的可以设置成自己打的编译目录。

C++写windows端rabbitmq客户端_第9张图片

 

C++写windows端rabbitmq客户端_第10张图片

3、依然我们使用VS打开工程源码,然后点击Release,32位->生成

生成目录下面就有我们需要的文件

C++写windows端rabbitmq客户端_第11张图片

(4)使用SimpleAmqpClient的例子

1、复制头文件跟库文件

打开VS2019,新建C++控制台项目,然后在工程根目录新建两个文件夹lib跟include。

include文件夹放入我们的rabbitmq头文件跟SimpleAmqpClient的头文件(到源码那里复制)

C++写windows端rabbitmq客户端_第12张图片

lib放入我们编译好的SimpleAmqpClient.2.lib跟rabbitmq.4.lib

2、配置工程

C++写windows端rabbitmq客户端_第13张图片

C++写windows端rabbitmq客户端_第14张图片

C++写windows端rabbitmq客户端_第15张图片

最后工程目录是这样子的:

C++写windows端rabbitmq客户端_第16张图片

然后在项目右键生成,在Release目录复制我们需要的dll(上面编译好的),又可以直接把这几个文件拉到资源文件目录设置文件的属性为复制文件,这样项目在生成过程中会帮你把dll复制到生成的文件夹中。

C++写windows端rabbitmq客户端_第17张图片

C++写windows端rabbitmq客户端_第18张图片

3、编写发送跟接收

Test.cpp

#include "SimpleAmqpClient/SimpleAmqpClient.h"
#include 

std::string queue_name = "hello";

void TestSend() {
    //创建channel
    AmqpClient::Channel::ptr_t channel = AmqpClient::Channel::Create("localhost");
    
    //创建队列,第一个参数为队列名称。
    channel->DeclareQueue(queue_name, false, true, false, false);
    
    std::string message = "hello,aaron";
    //第一个是exchange名称,第二个参数是routing_key(此处可理解为消息会被送往的队列)。
    channel->BasicPublish("", queue_name,AmqpClient::BasicMessage::Create(message));

    std::cout << "[x] send " << message<DeclareQueue(queue_name, false, true, false, false);
    //第二个参数为消费者名称,返回值也是消费者名称。
    std::string consumer_tag = channel->BasicConsume(queue_name, "");

    while (1) {
        AmqpClient::Envelope::ptr_t envelope = channel->BasicConsumeMessage(consumer_tag);

        std::string buffer = envelope->Message()->Body();
        //消息放在信封里,需要解析

        std::cout << "[y] receve " << buffer << std::endl;
    }

    channel->BasicCancel(consumer_tag);
    //关闭消费者。
}

int main() {
    TestSend();
    TestRev();
}

测试一下:

 

C++写windows端rabbitmq客户端_第19张图片

总结:

  目前找到的可用的库只有librabbitmq可以在windows上编译,如果知道有其它的库可以分享一下。

 

参考:

https://www.jianshu.com/p/e66849f17c36

 

 

你可能感兴趣的:(C++,杂碎,rabbitmq)