rabbitmq AmqpClient 使用Fanout 交换机投递与接收消息,C++代码示例
fanout交换器重点内容非常简单。
它只会将接收到的所有消息广播发送到它所知道的所有队列。
投递消息到交换机:
1 #include "SimpleAmqpClient/SimpleAmqpClient.h" 2 #include <iostream> 3 #include <string> 4 5 int main() { 6 AmqpClient::Channel::ptr_t channel = 7 AmqpClient::Channel::Create("localhost"); 8 9 //创建一个名为"fanout_logs"的交换器,类型为fanout。 10 std::string exchange_name = "fanout_logs"; 11 channel->DeclareExchange(exchange_name, 12 AmqpClient::Channel::EXCHANGE_TYPE_FANOUT); 13 14 // 这里不需要队列,生产者(投递方)不需要知道消息被投递到哪一个具体的队列, 15 // 只需要知道投递到哪一个交换机即可。 16 // 消息具体会被投递到哪个队列由交换机去处理。 17 // 实际上就是消费者所创建的队列只要绑定到此交换机就会收到该消息。 18 // 交换机会知道哪些队列绑定到了自己,他将消息投递给绑定到自己的所有队列。 19 #if 0 20 std::string queue_name = channel->DeclareQueue("", false, true, false, false); 21 //第一个参数为空,系统默认生成随机队列名称。 22 23 channel->BindQueue(queue_name, exchange_name, ""); 24 //将队列与交换器绑定。 25 //这里routingKey的值为"",表示所有信息都会被发送。 26 #endif 27 28 while (1) { 29 std::cout << "请输入要发送的信息:" << std::endl; 30 31 std::string message; 32 std::getline(std::cin, message); 33 34 channel->BasicPublish(exchange_name, "", 35 AmqpClient::BasicMessage::Create(message)); 36 37 std::cout << "[x] send " << message << std::endl; 38 } 39 }
从交换 机获取消息
1 #include "SimpleAmqpClient/SimpleAmqpClient.h" 2 #include <iostream> 3 4 int main() { 5 AmqpClient::Channel::ptr_t channel = AmqpClient::Channel::Create("localhost"); 6 7 std::string exchange_name = "fanout_logs"; 8 //创建一个名为"fanout_logs"的交换器,类型为fanout。 9 channel->DeclareExchange(exchange_name, 10 AmqpClient::Channel::EXCHANGE_TYPE_FANOUT); 11 12 //第三个参数表明队列是持久的(durable )。 13 std::string queue_name = "queue_fanout" 14 channel->DeclareQueue(queue_name, false, true, false, false); 15 16 //将队列与交换器绑定。 17 // routingKey的值将被 fanout交换器忽略。 18 channel->BindQueue(queue_name, exchange_name, ""); 19 20 //将第4个参数改为true,开启消息确认。 21 //将第5个参数改为false,取消独占队列。 22 // 如果同时多个消费者使用了这个队列,那么同一个消息只会随机发送到其中一个。 23 //最后一个同时不超过一个任务。(非平均分配)。 24 std::string consumer_tag = 25 channel->BasicConsume(queue_name, "", true, true, false, 1); 26 27 while (1) { 28 std::cout << "等待接收信息中" << std::endl; 29 30 AmqpClient::Envelope::ptr_t envelope = 31 channel->BasicConsumeMessage(consumer_tag); 32 33 std::string buffer = envelope->Message()->Body(); 34 35 std::cout << "[y] receve " << buffer << std::endl; 36 } 37 38 channel->BasicCancel(consumer_tag); 39 }