// 消息发送
bool PublishExchangeTopicMulti(const std::string &strUri)
{
AmqpClient::Channel::ptr_t channel =
AmqpClient::Channel::CreateFromUri(strUri); if (channel == nullptr)
{
return false;
} // 声明交换机,若不存在则创建
std::string strTopicExchange1 = "topic_exchange_1";
std::string strTopicExchange2 = "topic_exchange_2";
channel->DeclareExchange(strTopicExchange1, AmqpClient::Channel::EXCHANGE_TYPE_TOPIC);
channel->DeclareExchange(strTopicExchange2, AmqpClient::Channel::EXCHANGE_TYPE_TOPIC); while (true)
{
// 可输入例如 "topic_exchange_1 disk.info 666"
// "topic_exchange_2 any.warning 123"
std::cout << "请输入[exchange] [routing_key1.routing_key2] [message]: " << std::endl; std::string strExchange;
std::string severity;
std::string message;
std::cin >> strExchange;
std::cin >> severity;
std::cin >> message; channel->BasicPublish(strExchange, severity,
AmqpClient::BasicMessage::Create(message)); std::cout << "[X] to " << strExchange << ", send "
<< severity << ": " << message << std::endl;
} } void ReceiveTopicExchangeMulti(const std::string &strUri)
{
AmqpClient::Channel::ptr_t channel =
AmqpClient::Channel::CreateFromUri(strUri); if (channel == nullptr)
{
return ;
} // 这里我们声明两个交换机,类型均为topic , 我们将通过不同的队列从两个交换机中取消息。
// 这里交换机的名称需要与发送端的保持一致。
std::string strTopicExchange1 = "topic_exchange_1";
std::string strTopicExchange2 = "topic_exchange_2";
channel->DeclareExchange(strTopicExchange1, AmqpClient::Channel::EXCHANGE_TYPE_TOPIC);
channel->DeclareExchange(strTopicExchange2, AmqpClient::Channel::EXCHANGE_TYPE_TOPIC); // 这里我们声明了三个队列,第一个队列从交换机1 取数据第二三个队列从交换机2 取数据;
// 但是第二三个队列所绑定的routing_key 有所不同。
// 当然了,routing_key 也可以相同,这样的话相同routing_key 的消息就会在两个队列中都出现。
std::string strTopicQueue_1 = "topic_queue_1";
std::string strTopicQueue_2 = "topic_queue_2";
std::string strTopicQueue_3 = "topic_queue_3";
// 第一个参数若为空,则系统默认生成随机队列名称
// 第三个参数 表明队列是否持久的。true: 服务器重启将会保留该Exchange,
// 警告,若只设置此项,不代表消息的持久化。即不保证重启后消息还在。
channel->DeclareQueue(strTopicQueue_1, false, true, false, false);
channel->DeclareQueue(strTopicQueue_2, false, true, false, false);
channel->DeclareQueue(strTopicQueue_3, false, true, false, false); // 队列绑定我们感兴趣的routing_key, 表示我们只接收这些routing_key 相关的消息。
channel->BindQueue(strTopicQueue_1, strTopicExchange1, "*.info");
channel->BindQueue(strTopicQueue_1, strTopicExchange1, "disk.*");
channel->BindQueue(strTopicQueue_1, strTopicExchange1, "info.error"); // 在交换机2 上面我们绑定了队列2 和队列3 。但是它们所关心的routing_key 不同。
channel->BindQueue(strTopicQueue_3, strTopicExchange2, "*.info");
channel->BindQueue(strTopicQueue_3, strTopicExchange2, "disk.*");
channel->BindQueue(strTopicQueue_2, strTopicExchange2, "info.error"); // 创建消费者标志,这个在后面会告诉 channel 我们需要哪些队列中的相关routing_key 的消息。
// BasicConsume() 第五个参数是指该消息是否以独占的方式处理,若是则不允许第二个消费者绑定到该队列 上,
// 若否,则多个消费者同时绑定到该队列,那么 在该队列上的消息将随机分配到某一个消费者。
// 即,同一个消息将不会同时出现 在两个消费者身上。
std::string strFlagConsume_1 = "tab_consume_1";
std::string strFlagConsume_2 = "tab_consume_2";
std::string strFlagConsume_3 = "tab_consume_3";
channel->BasicConsume(strTopicQueue_1, strFlagConsume_1, true, false, true);
channel->BasicConsume(strTopicQueue_2, strFlagConsume_2, true, false, true);
channel->BasicConsume(strTopicQueue_3, strFlagConsume_3, true, false, true);
// BasicConsume() 的第4 个参数为false 表示,我们需要主动ack 服务器才将该消息清除。 std::vector<std::string> vecFlagConsume;
vecFlagConsume.push_back(strFlagConsume_1);
vecFlagConsume.push_back(strFlagConsume_2);
vecFlagConsume.push_back(strFlagConsume_3); while (true)
{
AmqpClient::Envelope::ptr_t envelope = channel->BasicConsumeMessage(vecFlagConsume); std::string strExchange = envelope->Exchange();
std::string strFlagConsume = envelope->ConsumerTag();
std::string severity = envelope->RoutingKey();
std::string buffer = envelope->Message()->body(); std::cout << "[Y] exchange: " << strExchange << ", flagconsume: " << strflagConsume
<< ", receive " << severity << ": " << buffer << std::endl; channel->BasicAck(envelope);
} for (size_t i = ; i < vecFlagConsume.size(); ++i)
channel->BasicCancel(vecFlagConsume[i]);
}

rabbitmq AmqpClient 使用Topic 交换机同一个channel 同时多个队列 ,多个交换机,C++代码示例的更多相关文章

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

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

  2. 7.RabbitMQ系列之topic主题交换器

    topic主题交换器它根据在队列绑定的路由键和路由模式通配符匹配将消息路由到队列. 生产者在消息头中添加路由键并将其发送到主题交换器. 收到消息后,exchange尝试将路由键与绑定到它的所有队列的绑 ...

  3. RabbitMQ基础学习笔记(C#代码示例)

    一.定义: MQ是MessageQueue,消息队列的简称(是流行的开源消息队列系统,利用erlang语言开发).MQ是一种应用程序对应用程序的通信方法.应用程序通过读写入队和出队的消息来通信,无需专 ...

  4. RabbitMQ的使用(五)RabbitMQ Java Client简单生产者、消费者代码示例

    pom文件: <dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artif ...

  5. RabbitMQ 入门系列:9、扩展内容:死信队列:真不适合当延时队列。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  6. RabbitMQ 入门系列:10、扩展内容:延时队列:延时队列插件及其有限的适用场景(系列大结局)。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

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

    // 以DIRECT 交换机和ROUTING_KEY的方式进行消息的发布与订阅 // send // strUri = "amqp://guest:guest@192.168.30.11:8 ...

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

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

  9. RabbitMQ通过Exchange.topic 对routingkey 进行正则表达式匹配

    消费者: static void Main(string[] args) { ConnectionFactory factory = new ConnectionFactory() { HostNam ...

随机推荐

  1. 2019-1-28-WPF-高性能笔

    title author date CreateTime categories WPF 高性能笔 lindexi 2019-1-28 14:21:5 +0800 2018-2-13 17:23:3 + ...

  2. 深入学习Redis持久化

    一.Redis高可用概述 在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义. 我们知道,在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常 ...

  3. 配置阿里云SLB全站HTTPS集群

    配置阿里云SLB全站HTTPS集群(以下内容仅为流程,信息可能有些对应不上) 1 登录阿里云购买两台实例 1.1 按量付费购买两台实例 1.2 配置网络可以不选择分配外网 1.3 自定义密码 1.4 ...

  4. 2019牛客多校第五场F maximum clique 1 最大独立集

    题意:给你n个数,现在让你选择一个数目最大的集合,使得集合中任意两个数的二进制表示至少有两位不同,问这个集合最大是多大?并且输出具体方案.保证n个数互不相同. 思路:容易发现,如果两个数不能同时在集合 ...

  5. 转 HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth之完全详解

    HTML:scrollLeft,scrollWidth,clientWidth,offsetWidth到底指的哪到哪的距离之完全详解 scrollHeight: 获取对象的滚动高度. scrollLe ...

  6. 部署.net Core 到 Windows server 2008 r2 IIs

    1. 将项目发布 2.iis 新建网站,设置 3 安装windows  server  hosting 4 关于报错 1.下载sdk https://www.microsoft.com/net/lea ...

  7. 如果全球的沙子都对你发起DDoS攻击,如何破?

    IPv6已来 2016年6月1日开始,苹果规定所有提交至AppStore的应用必须兼容IPv6-only标准.可以预计,2018年底会有大量互联网资源.上网用户使用IPv6协议.这意味着,如果一个互联 ...

  8. Python每日一题 003

    将 002 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中. 代码 import pymysql import uuid def get_id(): for i in ra ...

  9. Spring 容器中bean的加载过程

    bean 的加载过程大致可以分为以下几个步骤: 1.获取配置的资源文件 2.对获取到的xml资源文件进行解析 3.获取包装资源 4.解析处理包装之后的资源 5.加载 提取bean 并进行注册(添加到b ...

  10. LOJ 2554 「CTSC2018」青蕈领主——结论(思路)+分治FFT

    题目:https://loj.ac/problem/2554 一个“连续”的区间必然是一个排列.所有 r 不同的.len 最长的“连续”区间只有包含.相离,不会相交,不然整个是一个“连续”区间. 只有 ...