RabbitMQ(六)——路由模式
RabbitMQ系列
RabbitMQ(六)——路由模式
前言
本章讲解路由模式,路由模式跟发布订阅模式类似,然后在发布订阅模式的基础上改变了类型(fanout => direct),订阅模式是分发到所有绑定到交换机的队列,路由模式只分发到绑定在交换机上面指定路由的队列,我们可以看一下下面这张图:

以上的图是info,error,warning为路由,表示日志的等级通过不同的路由发送到不同的队列中,下面开始路由模式start~~~~
发布订阅模式 VS 路由模式
发布:
发布订阅模式的类型为fanout,而路由模式类型为direct;
//发布订阅模式
channel.ExchangeDeclare(ExchangeName, "fanout");
//路由模式
channel.ExchangeDeclare(ExchangeName, "direct");
订阅发布模式发布时roukey参数为空字符串,路由模式指定了路由;
//发布订阅模式
channel.BasicPublish(ExchangeName, "", null, body);
//路由模式
channel.BasicPublish(ExchangeName, RouteName, null, body);
接收:
定义交换器时,与发布时一致,发布订阅模式为fanout,路由模式为direct;
//发布订阅模式
channel.ExchangeDeclare(ExchangeName, "fanout");
//路由模式
channel.ExchangeDeclare(ExchangeName, "direct");
绑定路由时,发布订阅模式的routekey参数为空字符串,表示接受所有消息,而路由模式的routekey参数必须指定某一路由。
//发布订阅模式
channel.QueueBind(queueName, ExchangeName, "");
//路由模式
channel.QueueBind(queueName, ExchangeName, routkey);
通过以上对比可以知道,路由模式与发布订阅模式基本一致,唯一差距就是两个参数,exchange类型和 routingKey
代码
生产者:
static void Main(string[] args)
{
Console.WriteLine("DirectServer发布服务器启动..."); //1.创建连接工厂
var factory = new ConnectionFactory()
{
HostName = "127.0.0.1",
UserName = "guest",
Password = "guest"
};
//2.创建连接
using (var conn = factory.CreateConnection())
{
//3.创建通道
using (var channel = conn.CreateModel())
{
//4.声明交换器
channel.ExchangeDeclare("directExchange", "direct"); string msg = "";
for (int i = 0; i < 20; i++)
{
msg = $"发布消息{i}";
string ROUTE_KEY = "";
var body = Encoding.UTF8.GetBytes(msg);
//模拟向不同路由发送消息
if (i % 2 == 0)
{
ROUTE_KEY = "route1";
}
else
{
ROUTE_KEY = "route2";
}
//5.发布消息
channel.BasicPublish("directExchange", ROUTE_KEY, null, body);
Console.WriteLine($"向{ROUTE_KEY}发布消息成功:{msg}"); Thread.Sleep(1000);
}
Console.ReadKey();
}
}
}
消费者1:
static void Main(string[] args)
{
Console.WriteLine("DirectClient接收客户端启动...");
//1.创建连接工厂
var factory = new ConnectionFactory()
{
HostName = "127.0.0.1",
UserName = "guest",
Password = "guest"
};
//2.创建连接
using (var conn = factory.CreateConnection())
{
//3.创建通道
using (var channel = conn.CreateModel())
{
//3.声明队列
var queue = channel.QueueDeclare().QueueName;
//4.绑定交换器
channel.QueueBind(queue, "directExchange", "route1");
//5.声明消费者 消费消息
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
//接收消息
var body = Encoding.UTF8.GetString(ea.Body.ToArray());
Console.WriteLine($"接收route1消息:{body.ToString()}");
};
channel.BasicConsume(queue, true, consumer); Console.ReadKey();
}
}
}
消费者2:
static void Main(string[] args)
{
Console.WriteLine("DirectClient接收客户端启动...");
//1.创建连接工厂
var factory = new ConnectionFactory()
{
HostName = "127.0.0.1",
UserName = "guest",
Password = "guest"
};
//2.创建连接
using (var conn = factory.CreateConnection())
{
//3.创建通道
using (var channel = conn.CreateModel())
{
//3.声明队列
var queue = channel.QueueDeclare().QueueName;
//4.绑定交换器
channel.QueueBind(queue, "directExchange", "route2");
//5.声明消费者 消费消息
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, e) =>
{
byte[] message = e.Body.ToArray();
Console.WriteLine("接收消息:" + Encoding.UTF8.GetString(message));
//返回消息确认
channel.BasicAck(e.DeliveryTag, false);
};
//消费者开始监听
channel.BasicConsume(queue, true, consumer); Console.ReadKey();
}
}
}
可以看到生产者发布消息时指定了路由rout1/rout2,随后消息会转发到route1/route2路由上。接收时通过将一个队列与交换器绑定,指定路由route1/route2,这样就能接收到route1/route2路由上的消息。
效果
消费者定义的随机队列

向route1、route2发布消息,两个消费者分别接收route1和route2的消息

效果
路由模式中生产者发布消息时指定路由,向指定路由发送,消费者绑定交换器与路由即可接收到生产者向此路由发布的消息;
只有将消费者发送消息的交换器、路由 与生产者指定的交换器、路由一致,消费者才能接收到生产者向指定路由的消费者发送的消息。
注意:声明路由时类型必须为direct
附上Demo地址:https://github.com/1164887865/RabbitMQDemo
RabbitMQ(六)——路由模式的更多相关文章
- RabbitMQ 的路由模式 Topic模式
模型 生产者 package cn.wh; import java.io.IOException; import java.util.concurrent.TimeoutException; impo ...
- Rabbitmq(5) 路由模式
设置路由键 发送者 package com.aynu.bootamqp.service; import com.aynu.bootamqp.commons.utils.Amqp; import com ...
- RabbitMQ (六) 订阅者模式之路由模式 ( direct )
路由模式下,生产者发送消息时需要指定一个路由键(routingKey),交换机只会把消息转发给包含该路由键的队列 这里,我们改变一下声明交换机的方式. 我们通过管理后台添加一个交换机. 添加后,生产者 ...
- rabbitMQ的三种路由模式
rabbitMQ工作流程: 1.声明交换机 2.声明消息队列 3.绑定交换机和队列 4.生产者往交换机里发送新消息 5.交换机根据所选的模式和routingKey决定消息发往哪条消息队列 6.一个消费 ...
- RabbitMQ六种队列模式-路由模式
前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式 [本文]RabbitMQ六种队列模式-主 ...
- RabbitMQ学习第四记:路由模式(direct)
1.什么是路由模式(direct) 路由模式是在使用交换机的同时,生产者指定路由发送数据,消费者绑定路由接受数据.与发布/订阅模式不同的是,发布/订阅模式只要是绑定了交换机的队列都会收到生产者向交换机 ...
- RabbitMQ 一二事(4) - 路由模式介绍
路由模式其实和订阅模式差不多,只不过交换机的类型不同而已 路由模式可以用下图来表示,比订阅模式多了一个key,举个栗子就是根据不同的人群来订阅公众号,来收取消息 根据不同的key来获取不同的消息 最简 ...
- python使用rabbitMQ介绍四(路由模式)
一.模式介绍 路由模式,与发布-订阅模式一样,消息发送到exchange中,消费者把队列绑定到exchange上. 这种模式在exchange上添加添加了一个路由键(routing-key),生产者发 ...
- 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_10.RabbitMQ研究-工作模式-路由工作模式介绍
队列在绑定交换机的时候可以指定routingKey, 路由模式: 1.每个消费者监听自己的队列,并且设置routingkey. 2.生产者将消息发给交换机,由交换机根据routingkey来转发消息到 ...
- RabbitMQ六种队列模式-简单队列模式
前言 RabbitMQ六种队列模式-简单队列 [本文]RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ...
随机推荐
- LeetCode721 账户合并
题解 对于\(vector<vector<string>> accounts\),我们定义\(accounts[i]\)为一个列表项.对于\(accounts\)中的一条列表项 ...
- 腾讯云 COS 多 AZ 存储保证服务高可用性
腾讯云 COS 的多 AZ 存储架构能够为用户数据提供数据中心级别的容灾能力.多 AZ 存储将客户数据分散存储在城市中多个不同的数据中心,当某个数据中心因为自然灾害.断电等极端情况导致整体故障时,多 ...
- VB 的一些歧义(不断更新)
foo . bar 它可能是 foo.bar() 也可能是 foo(withObj.bar). f (a) , b 它可能是 call f(a)._DEFAULT(a)(Missing, b) 也可能 ...
- postgresql序列重复问题处理
问题 在执行数据插入时,postgresql 提示more than one owned sequence found错误.这个和之前文章中写的序列编号错乱不同,是由数据表的一个列生成了多个序列导致的 ...
- 【实训总结报告】大二下学期期末Java EE实训报告
站点在微信公众号(萌狼蓝天)回复便可以访问
- maven常见命令之 -pl -am -amd
昨天maven的deploy任务需要只选择单个模块并且把它依赖的模块一起打包,第一时间便想到了-pl参数,然后就开始处理,但是因为之前只看了一下命令的介绍,竟然花了近半小时才完全跑通,故记录此文. 假 ...
- Spring Boot logback springProperty 设置默认值
springProperty 当没有读取到source字段中设置的log.path值时,设置为defaultValue字段中的${user.dir}/logs变量值. <springProper ...
- Linux打印显示时间
Linux打印显示时间具体使用参数如下: 1.输出当前年月日echo $(date +%F)2.输出当前时间(时分)echo $(date +%R)3.输出当前时间(时分秒)echo $(date + ...
- Qt编写视频监控系统74-悬浮工具栏(半透明/上下左右位置/自定义按钮)
一.前言 在监控系统中一般在视频实时预览的时候,希望提供一个悬浮工具条,可以显示一些提示信息比如分辨率.码率.帧率,提供一堆快捷操作按钮,可以录像.抓拍.云台控制.关闭等操作,参考了国内很多监控厂商客 ...
- Qt音视频开发22-音频播放QAudioOutput
一.前言 以前一直以为只有Qt5以后才有QAudioOutput播放音频,其实从Qt4.6开始就有,在Qt6中变成了QAudioSink,功能一样.用QAudioOutput播放音频pcm数据极其方便 ...