第三方消息队列服务RabbitMQ
RabbitMQ简介
- 可靠性(Reliability):RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
- 灵活的路由(Flexible Routing):在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。
- 消息集群(Clustering):多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。
- 高可用(Highly Available Queues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
- 多种协议(Multi-protocol):RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。
- 多语言客户端(Many Clients):RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。
- 管理界面(Management UI):RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。
- 跟踪机制(Tracing):如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。
- 插件机制(Plugin System):RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。
RabbitMQ server安装
- RabbitMQ服务端代码是使用并发式语言Erlang,所以先安装Erlang
- Erlang官网http://www.erlang.org/downloads,下载对应版本后,安装
image
- 安装位置任意,安装过程中会自动把安装位置的bin目录加入PATH环境变量
- Erlang官网http://www.erlang.org/downloads,下载对应版本后,安装
- 官网http://www.rabbitmq.com/,下载对应的安装文件exe,安装
image
-
进入安装目录的sbin目录
image
- 输入
rabbitmq-plugins enable rabbitmq_management
安装rabbitmq对应的web管理界面 - rabbitmq安装后会在操作系统中注册为系统服务,并且自动启动。在浏览器中输入http://127.0.0.1:15672,如果正确显示rabbitmq的web界面,则安装正确
image
RabbitMQ-c安装
- 环境:
- PC:win10 64位
- VS版本:VS2015 msvc14 64bit编译器
- RabbitMQ-c版本:v0.9.0
- 拉取RabbitMQ-c源码:
git clone https://github.com/alanxz/rabbitmq-c.git
- 进入RabbitMQ-c目录
cd $RabbitMQ-c_PATH/
,创建build文件夹mkdir build
- 打开cmake-gui,设置src与build目录为
$RabbitMQ-c_PATH/
和$RabbitMQ-c_PATH/build
-
编译器选择msvc2014 64bit,如果没有弹出让你选择编译器,则可以点击file->delete cache来删除缓存,重新选择编译器
image
-
取消勾选ENABLE_SSL_SUPPORT,依次按下configure->generate->open project,在VS2015中打开项目
image
-
VS中设置64bit release版本
image
-
生成解决方案
image
-
在对应目录下生成库文件
image
RabbitMQ-c封装库SimpleAmqpClient安装
- 安装boost
- 注意,一定要安装二进制安装文件,不要下载源码自己编译,自己编译可能出现很多问题
- 下载地址https://sourceforge.net/projects/boost/files/boost-binaries/
-
安装后,include路径为
image ,lib路径为
image
- 安装doxygen(这一步是为了生成API Document,可以不做)
- 下载地址http://www.doxygen.nl/download.html
-
image
直接下载对应的安装文件,安装后会自动加入PATH环境变量
- git拉取SimpleAmqpClient源码,在SimpleAmqpClient源码下创建build目录
- cmake设置src目录和build目录
-
取消ENABLE_SSL_SUPPORT,手动添加Boost_USE_STATIC_LIBS二进制类型
image
- 手动添加BOOST_ROOT,填入BOOST的安装根目录;手动添加BOOST_LIBRARY,填入BOOST库目录
- 手动添加Rabbitmqc_INCLUDE_DIR,填入Rabbitmqc的头文件路径,手动添加Rabbitmqc_LIBRARY,填入Rabbitmqc的库路径
- 取消勾选ENABLE_SSL_SUPPORT,依次按下configure->generate->open project,在VS2015中打开项目
- VS中设置64bit release版本
- 在项目属性中添加Rabbitmqc的头文件路径、boost头文件路径,Rabbitmqc的库路径、boost库路径,和对应的lib名称
-
右键点击项目中的SimpleAmqpClient,点击重新生成,编译成功后,会在build/release目录下生成对应的库
image
SimpleAmqpClient Demo测试
- VS中新建项目
- 添加Rabbitmqc的头文件和库文件;添加boost的头文件和库文件;添加SimpleAmqpClient的头文件和库文件(怎么添加不详述了)
- 分别编译下列两个程序,执行后,可以在Send.cpp对应的console中输入任意字符,回车,在Recv.cpp对应的console中可以接收到输入,同时在Rabbitmq的web管理界面可以看到有两个连接接入,并且消息队列的数据流情况都可以看到
Send.cpp
#include <SimpleAmqpClient/SimpleAmqpClient.h>
#include <iostream>
int main() {
std::string queue_name = "hello";
AmqpClient::Channel::ptr_t channel = AmqpClient::Channel::Create("localhost");
//创建channel
channel->DeclareQueue(queue_name, false, true, false, false);
//创建队列,第一个参数为队列名称,其余后续会提到。
std::string message;
std::cin >> message;
channel->BasicPublish("", queue_name,
AmqpClient::BasicMessage::Create(message));
//第一个是exchange名称,第二个参数是routing_key(此处可理解为消息会被送往的队列)。
qDebug() << "[x] send " << QString::fromStdString(message);
}
Recv.cpp
#include <SimpleAmqpClient/SimpleAmqpClient.h>
#include <iostream>
int main() {
std::string queue_name = "hello";
AmqpClient::Channel::ptr_t channel = AmqpClient::Channel::Create("localhost");
channel->DeclareQueue(queue_name, false, true, false, false);
std::string consumer_tag = channel->BasicConsume(queue_name, "");
//第二个参数为消费者名称,返回值也是消费者名称。
while (1) {
qDebug() << "[y] receve " << QString::fromStdString(buffer);
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);
//关闭消费者。
}
参考博文
- https://blog.csdn.net/lixiang987654321/article/details/81155299
- https://blog.csdn.net/weixin_39735923/article/details/79288578
- https://www.zhihu.com/question/20428371
- https://blog.csdn.net/csm201314/article/category/7023771
- https://www.jianshu.com/p/79ca08116d57
踩坑记录
- VS生成库时,提示找不到定义接入点,这是因为没有main函数,不是生成exe而是生成库https://blog.csdn.net/wushao126/article/details/51785505
- 在win10上编译第三方库时,可以采用CMake配置生成sln对应的文件,然后用VS打开sln进行编译
- opencv3.0 "ACCESS_MASK" ambiguous symbolhttps://blog.csdn.net/xu20082100226/article/details/45482387
网友评论