// 以DIRECT 交换机和ROUTING_KEY的方式进行消息的发布与订阅
// send
// strUri = "amqp://guest:guest@192.168.30.11:8820/test"
// strUri = "amqp://[帐户名]:[密码]@[服务主机以及端口]/[虚拟机目录]
bool PublicshExchangeDirect(const std::string &strUri, const std::string &strDirectExchange)
{
// 连接到rabbitMQ 服务器
AmqpClient::Channel::ptr_t channel =
AmqpClient::Channel::CreateFromUri(strUri);
if (channel == nullptr)
{
std::cout << "channel is nullptr" << std::endl;
return false;
} // 创建指定类型的交换 机
channel->DeclareExchange(strDirectExchange, AmqpClient::Channel::EXCHANGE_TYPE_DIRECT); while (true)
{
// 发送消息,例 :
// > info info infomation
// > trace trace infomation
// > debug debug infomation
// > error error infomation
std::string strSeverity;
std::string strBody;
std::cout << "Enter [severity info]: ";
std::cin >> strSeverity;
std::getline(std::cin, strBody);
if (strBody == "quit")
break;
if (strBody.empty())
continue; std::cout << "strSeverity: " << strSeverity << "." << std::endl;
std::cout << "strBody: " << strBody << "." << std::endl; // 发布消息到rabbitMQ
// strSeverity 指定该消息的routing_key, 在接收端 只有绑定了该routing_key 的队列 才会接收到该消息。
channel->BasicPublish(strDirectExchange, strSeverity,
AmqpClient::basicMessage::Create(strBody)); std::cout << "publicsh: " << strBody << std::endl;
} return true;
} // receive
void ReceiveDirectExchange(const std::string &strUri, const std::string &strDirectExchange)
{
AmqpClient::Channel::ptr_t channel =
AmqpClient::Channel::CreateFromUri(strUri);
if (channel == nullptr)
{
std::cout << "failed" << std::endl;
return;
} // 创建指定类型的交换机,我们将从该交换 机中读取消息
channel->DeclareExchange(strDirectExchange, AmqpClient::Channel::EXCHANGE_TYPE_DIRECT); std::string strQName = "queue_direct";
// 第一个参数为空,则系统默认生成随机名称
// 第三个参数(durable)表明队列 是否持久化
// durable:true、false。 true:服务器重启会保留下来Exchange。
// 警告:仅设置此选项,不代表消息持久化。即不保证重启后消息还在。
channel->DeclareQueue(strQName, false, true, false, false); // 队列绑定我们感 兴趣的routing_key, 表示 我们只接收这些routing_key 相关的消息。
channel->BindQueue(strQName, strDirectExchange, "info");
channel->BindQueue(strQName, strDirectExchange, "trace");
channel->BindQueue(strQName, strDirectExchange, "error"); // 得到消费者的相关标记,用于订阅rabbitMQ 上的指定消息。
// 将第4个参数改为false,开启消息确认。
// 需要调用channel->BasicAck(xxx);
// 服务器上面的消息才会被清除,否则将一直保留在rabbitMQ 服务端 。
// 将第5个参数改为false,取消独占队列。
std::string strConsumer = channel->BasicConsume(strQName, "", true, false, false, ); while (true)
{
std::cout << "[RECIVE]: ";
AmqpClient::Envelope::ptr_t envelope =
channel->BasicConsumeMessage(strConsumer); std::cout << envelope->Message()->Body() << std::endl;
// 下面两个接口是一样的
channel->BasicAck(envelope);
// channel->BasicAck(envelope->GetDeliveryInfo());
} channel->BasicCancel(consumer_tag);
}

rabbitmq AmqpClient 使用Direct 交换机投递与接收消息,C++代码示例的更多相关文章

  1. rabbitmq AmqpClient 使用Topic 交换机投递与接收消息,C++代码示例

    // strUri = "amqp://guest:guest@192.168.30.11:8820/test" // strUri = "amqp://[帐户名]:[密 ...

  2. rabbitmq AmqpClient 使用Fanout 交换机投递与接收消息,C++代码示例

    fanout交换器重点内容非常简单.它只会将接收到的所有消息广播发送到它所知道的所有队列. 投递消息到交换机: #include "SimpleAmqpClient/SimpleAmqpCl ...

  3. Android Java使用JavaMail API发送和接收邮件的代码示例

    JavaMail是Oracle甲骨文开发的Java邮件类API,支持多种邮件协议,这里我们就来看一下Java使用JavaMail API发送和接收邮件的代码示例 使用Javamail发送邮件,必需的j ...

  4. rabbitmq AmqpClient 使用Topic 交换机同一个channel 同时多个队列 ,多个交换机,C++代码示例

    // 消息发送 bool PublishExchangeTopicMulti(const std::string &strUri) { AmqpClient::Channel::ptr_t c ...

  5. KeyBord事件分发和接收简要过程代码示例

    step1:调用ViewRootImpl的内部类ImeInputStage的成员函数onProcess来判断输入法是否处于激活状态 final class ImeInputStage extends ...

  6. RabbitMQ之Exchange Direct模式

    场景: 生产者发送消息到交换机并指定一个路由key, 消费者队列绑定到交换机时要指定路由key(key匹配就能接受消息,key不匹配就不能接受消息) 例如:我们可以把路由key设置为insert ,那 ...

  7. RabbitMQ广播:direct模式

    一. 消息的广播需要exchange:exchange是一个转发器,其实把消息发给RabbitMQ里的exchange fanout: 所有bind到此exchange的queue都可以接收消息,广播 ...

  8. rabbitmq不同模式的交换机使用

    交换机的功能主要是接收消息并且转发到绑定的队列,交换机不存储消息,在启用ack模式后,交换机找不到队列会返回错误.交换机有四种类型:Direct, topic, Headers and Fanout( ...

  9. Rabbitmq的几种交换机模式

    Rabbitmq的核心概念(如下图所示):有虚拟主机.交换机.队列.绑定: 交换机可以理解成具有路由表的路由程序,仅此而已.每个消息都有一个称为路由键(routing key)的属性,就是一个简单的字 ...

随机推荐

  1. animation transition transform

    animation:动画名称 花费时间 运动曲线 何时开始 播放次数 是否反方向 div{width:100px;height:100px;background:red;animation:move ...

  2. 表单input中disabled提交后得不到值的解决办法

    input的字段当为diabled时时无法获取数值得,所以最近不要用这个,我们可以用readonly带替代,即可解决这类问题.  

  3. 孔浩老师的 Struts2 教程听课笔记(思维导图)

    最近有空重头学习了一遍孔浩老师的 Struts2 教程,重新写了一份听课笔记.后面常用 form 标签.服务器端验证.异常处理因为时间问题,没有来得及整理.后续我会抽空补上.最近忙着准备笔试.面试. ...

  4. js里面常用的正则表达式

    在工作中经常碰到关于表单的验证,一般采取正则表达是比较简洁,代码量少,但是却经常忘记一些正则的用法.下面记录工作中经常用到的正则表达式. * 代表0次或者多次   +代表1次或者多次  ?代表0次或者 ...

  5. http预请求 options

    问题 使用axios请求接口时,出现了发出两次请求的情况:一个是请求OPTIONS,一个是正常的POST请求:查资料发现与跨域请求有关. 概念 MDN中有提到: 出于安全原因,浏览器限制从脚本内发起的 ...

  6. grammar_action

    w ll = [] for i in range(0, 10, 1): ll.append(i) print(ll) for i in ll: if i < 6: print(i) index_ ...

  7. MySQL case when then else end用法

    链接:https://blog.csdn.net/konglongaa/article/details/80250253 case具有两种格式,简单case函数和case搜索函数. 1.简单case函 ...

  8. Sparse PCA: reproduction of the synthetic example

    The paper: Hui Zou, Trevor Hastie, and Robert Tibshirani, Sparse Principal Component Analysis, Journ ...

  9. 130、TensorFlow操作多个计算图

    # Programming with multiple graphs # 当训练一个模型的时候一个常用的方式就是使用一个图来训练你的模型 # 另一个图来评价和计算训练的效果 # 在许多情况下前向计算和 ...

  10. 慎用create table as select,一定要注意默认值的问题

    再做一些数据迁移时候,很多人会使用create table  as select * from table where id=-1的方式来年建立一摸一样的表,但是这样做有个很大的弊端,不能将原表中的d ...