// 以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. 理解性能的奥秘——应用程序中慢,SSMS中快(4)收集解决参数嗅探问题的信息

    ---从计划缓存中直接获取查询计划和参数: ), ) SELECT @dbname = 'hydee_连锁', @procname = 'dbo.p_select_ware'; WITH baseda ...

  2. php in_array()函数 语法

    php in_array()函数 语法 作用:搜索数组中是否存在指定的值.大理石机械构件价格 语法:in_array(search,array,type) 参数: 参数 描述 search 必需.规定 ...

  3. web大文件断点续传

    1,项目调研 因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 在GoogleCode上面,代码弄下来超级不方便,还是配置hosts才好,把代码重新上传到了github上面. http ...

  4. git commit --amend用法(摘抄)

    适用场景: 比方说,你的代码已经提交到git库,leader审核的时候发现有个Java文件代码有点问题,于是让你修改,通常有2种方法: 方法1:leader 将你提交的所有代码 abandon掉,然后 ...

  5. Java 设计模式之 简单工厂模式(静态工厂方法模式)

    简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的 ...

  6. (转)cat > file << EOF 的用法

    转:https://www.cnblogs.com/chenjingchao/p/6259572.html cat> 文件名<<eof 用来创建文件在这之后输入任何东西 都是在 文件 ...

  7. php面试专题---21、MVC框架基本工作原理考察点

    php面试专题---21.MVC框架基本工作原理考察点 一.总结 一句话总结: 会的东西快速过,不要浪费时间,生命有限,都是一些很简单的东西. 1.mvc框架单一入口的 优势 是什么? 可以进行统一的 ...

  8. Mysql 链接数据库时区错误

    错误信息:Error querying database.  Cause: java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ ...

  9. 鸿蒙系统开源学习经验分享HarmonyOS[www.allharmonyos.com]

    分享鸿蒙系统开源知识,分享学习经验,分享鸿蒙系统开发经验 www.allharmonyos.com https://gitee.com/allharmonyos https://github.com/ ...

  10. Linux 初始化系统(init)- systemd

    wikipedia 浅析 Linux 初始化 init 系统 systemd 中文手册 fedoraproject - systemd 1. Systemd 简介 Systemd 是 Linux 系统 ...