前记
之前也写过rabbitmq的笔记(链接点此),但当时是参见官网的java版本(链接点此)所写,更像是译文,而后在实际过程中,要用到C++来使用消息队列,然而官网却没有C++相关的教程,经过自己的摸索,我把官网的教程代码翻译成C++版本,并做了些注释,希望能对有需要的人有帮助。
需要安装
使用C++来写rabbitmq代码时,我使用的是SimpleAmqpClient,需要安装的还挺多,但其github上也有详细的各部分安装地址,可以参考,基本不会有太大问题,如有问题,可在评论提问,如有解决办法,必定回复。
笔记代码四
因为代码其实跟java版本比较相似,一些函数(方法)较为不同,概念上还是大同异端,如果有概念上的不懂,可参照RabbitMQ 学习笔记(四):Routing,接下来为代码部分,跟rabbitmq官网其它语言的例子相似,不做过多解释,有兴趣也可以看看官网其它语言此例子如何写。
EmitLogDirect.cpp代码如下:
#include "SimpleAmqpClient/SimpleAmqpClient.h"
#include <iostream>
int main() {
AmqpClient::Channel::ptr_t channel = AmqpClient::Channel::Create("localhost");
std::string exchange_name = "direct_logs";
channel->DeclareExchange(exchange_name,
AmqpClient::Channel::EXCHANGE_TYPE_DIRECT);
//创建一个名为"direct_logs"的交换器,类型为direct。
std::string queue_name = channel->DeclareQueue("", false, true, false, false);
//第一个参数为空,系统默认生成随机队列名称。
channel->BindQueue(queue_name, exchange_name, "");
//将队列与交换器绑定。
//这里routingKey的值为"",表示所有信息都会被发送。
while (1) {
std::cout << "请输入 [routing_key] [message], 如 error 404" << std::endl;
std::string severity, message;
std::cin >> severity >> message;
//可输入例如 "info 666" 或者 "warning 123" 或者 "error
//404"表示信息严重程度和内容。
channel->BasicPublish(exchange_name, severity,
AmqpClient::BasicMessage::Create(message));
//消息的severity作为routing_key。
std::cout << "[x] send " << severity << ": " << message << std::endl;
}
}
ReceiveLogsDirect.cpp代码如下:
#include "SimpleAmqpClient/SimpleAmqpClient.h"
#include <iostream>
int main() {
AmqpClient::Channel::ptr_t channel = AmqpClient::Channel::Create("localhost");
std::string exchange_name = "direct_logs";
channel->DeclareExchange(exchange_name,
AmqpClient::Channel::EXCHANGE_TYPE_DIRECT);
//创建一个名为"direct_logs"的交换器,类型为direct。
std::string queue_name = channel->DeclareQueue("", false, true, false, false);
//第一个参数为空,系统默认生成随机队列名称。
//第三个参数表明队列是持久的(durable )。
std::cout << "请输入交换器订阅的类型(info, error, warning):";
std::string routing_key;
std::cin >> routing_key;
channel->BindQueue(queue_name, exchange_name, routing_key);
//将队列与交换器绑定。
std::string consumer_tag =
channel->BasicConsume(queue_name, "", true, true, false, 1);
//将第4个参数改为true,开启消息确认。
//将第5个参数改为false,取消独占队列。
while (1) {
std::cout << "routing_key为" << routing_key << ",等待消息中" << std::endl;
AmqpClient::Envelope::ptr_t envelope =
channel->BasicConsumeMessage(consumer_tag);
std::string severity = envelope->RoutingKey();
std::string buffer = envelope->Message()->Body();
std::cout << "[y] receve " << severity << ": " << buffer << std::endl;
}
channel->BasicCancel(consumer_tag);
}
注意:代码编译时需要加参数 -lSimpleAmqpClient
如EmitLogDirect.cpp的编译命令为:
g++ EmitLogDirect.cpp -o EmitLogDirect -lSimpleAmqpClient
即可生成可执行文件EmitLogDirect
相关链接
rabbitmq-c++(SimpleAmqpClient) 笔记代码系列:
rabbitmq-c++(SimpleAmqpClient) 笔记代码一
rabbitmq-c++(SimpleAmqpClient) 笔记代码二
rabbitmq-c++(SimpleAmqpClient) 笔记代码三
rabbitmq-c++(SimpleAmqpClient) 笔记代码四
rabbitmq-c++(SimpleAmqpClient) 笔记代码五
rabbitmq-c++(SimpleAmqpClient) 笔记代码六
RabbitMQ 学习笔记系列:
RabbitMQ 学习笔记(一):简单介绍及”Hello World”
RabbitMQ 学习笔记(二):work queues
RabbitMQ 学习笔记(三):Publish/Subscribe
RabbitMQ 学习笔记(四):Routing
RabbitMQ 学习笔记(五):Topics
RabbitMQ 学习笔记(六):RPC