rabbitmq-c++(SimpleAmqpClient) 笔记代码五

来源:互联网 发布:淘宝新店旺旺提取神器 编辑:程序博客网 时间:2024/06/08 21:13

前记

之前也写过rabbitmq的笔记(链接点此),但当时是参见官网的java版本(链接点此)所写,更像是译文,而后在实际过程中,要用到C++来使用消息队列,然而官网却没有C++相关的教程,经过自己的摸索,我把官网的教程代码翻译成C++版本,并做了些注释,希望能对有需要的人有帮助。

需要安装

使用C++来写rabbitmq代码时,我使用的是SimpleAmqpClient,需要安装的还挺多,但其github上也有详细的各部分安装地址,可以参考,基本不会有太大问题,如有问题,可在评论提问,如有解决办法,必定回复。

笔记代码五

因为代码其实跟java版本比较相似,一些函数(方法)较为不同,概念上还是大同异端,如果有概念上的不懂,可参照RabbitMQ 学习笔记(五):Topics,接下来为代码部分,跟rabbitmq官网其它语言的例子相似,不做过多解释,有兴趣也可以看看官网其它语言此例子如何写。

EmitLogTopic.cpp代码如下:

#include "SimpleAmqpClient/SimpleAmqpClient.h"#include <iostream>int main() {  AmqpClient::Channel::ptr_t channel = AmqpClient::Channel::Create("localhost");  std::string exchange_name = "topic_logs";  channel->DeclareExchange(exchange_name,                           AmqpClient::Channel::EXCHANGE_TYPE_TOPIC);  //创建一个名为"direct_logs"的交换器,类型为topic。  std::string queue_name = channel->DeclareQueue("", false, true, false, false);  //第一个参数为空,系统默认生成随机队列名称。  channel->BindQueue(queue_name, exchange_name, "");  //将队列与交换器绑定。  //这里routingKey的值为"",表示所有信息都会被发送。  while (1) {    std::cout        << "请输入 [routing_key1.routing_key2] [message], 如 disk.error 404"        << std::endl;    std::string severity, message;    std::cin >> severity >> message;    //可输入例如 "disk.info 666" 或者 "any.warning 123" 或者 "some.error    //404"表示信息严重程度和内容。    channel->BasicPublish(exchange_name, severity,                          AmqpClient::BasicMessage::Create(message));    //消息的severity作为routing_key。    std::cout << "[x] send " << severity << ": " << message << std::endl;  }}

ReceiveLogsTopic.cpp的代码如下:

#include "SimpleAmqpClient/SimpleAmqpClient.h"#include <iostream>int main(){    AmqpClient::Channel::ptr_t channel =         AmqpClient::Channel::Create("localhost");    std::string exchange_name = "topic_logs";    channel->DeclareExchange(exchange_name, AmqpClient::Channel::EXCHANGE_TYPE_TOPIC);    //创建一个名为"topic_logs"的交换器,类型为topic。    std::string queue_name = channel->DeclareQueue("", false, true, false, false);    //第一个参数为空,系统默认生成随机队列名称。    //第三个参数表明队列是持久的(durable )。    std::cout << "请输入交换器订阅的类型(如disk.info, 省略可用*,如*.info,disk.*):";    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
如EmitLogTopic.cpp的编译命令为:

g++ EmitLogTopic.cpp -o EmitLogTopic -lSimpleAmqpClient

即可生成可执行文件EmitLogTopic

相关链接

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

原创粉丝点击