RabbitMQ (六) 订阅者模式之路由模式 ( direct )
路由模式下,生产者发送消息时需要指定一个路由键(routingKey),交换机只会把消息转发给包含该路由键的队列

这里,我们改变一下声明交换机的方式.
我们通过管理后台添加一个交换机.

添加后,生产者和消费者的代码中就不需要再声明交换机了.同样,也可以通过管理后台添加队列,那么代码中也不需要声明队列了.
生产者
public class Producer
{ private const string ExchangeName = "test_exchange_direct"; public static void Send()
{
IConnection connection = ConnectionHelper.GetConnection();
IModel channel = connection.CreateModel();
string msg = "hello world "; //把消息发送到交换机,交换机再转发到包含路由键"refuge"的队列.
channel.BasicPublish(ExchangeName, "refuge", null, Encoding.Default.GetBytes(msg));
Console.WriteLine($"send {msg}"); channel.Close();
connection.Close();
}
}
消费者1
public class Consumer1
{
private const string QueueName = "test_exchange1_queue";
private const string ExchangeName = "test_exchange_direct"; public static void Receive()
{
//获取连接
RabbitMQ.Client.IConnection connection = ConnectionHelper.GetConnection(); //创建通道
RabbitMQ.Client.IModel channel = connection.CreateModel(); //声明队列
channel.QueueDeclare(QueueName, false, false, false, null); //声明交换机
//channel.ExchangeDeclare(ExchangeName, "direct", false, false, null); //将队列绑定到交换机上,路由键为"wjire"
channel.QueueBind(QueueName, ExchangeName, "wjire", null); //添加消费者
EventingBasicConsumer consumer = new EventingBasicConsumer(channel); //注册事件
consumer.Received += (s, e) =>
{
byte[] bytes = e.Body;
string str = Encoding.Default.GetString(bytes);
Console.WriteLine("consumer1 : " + str);
}; //监听队列
channel.BasicConsume(QueueName, true, "", false, false, null, consumer);
}
}
消费者2
public class Consumer2
{
private const string QueueName = "test_exchange2_queue";
private const string ExchangeName = "test_exchange_direct";
public static void Receive()
{
//获取连接
RabbitMQ.Client.IConnection connection = ConnectionHelper.GetConnection(); //创建通道
RabbitMQ.Client.IModel channel = connection.CreateModel(); //声明队列
channel.QueueDeclare(QueueName, false, false, false, null); //声明交换机
//channel.ExchangeDeclare(ExchangeName, "direct", false, false, null); //将队列绑定到交换机上,该队列匹配两个路由键,"refuge"和"wjire"
channel.QueueBind(QueueName, ExchangeName, "refuge", null);
channel.QueueBind(QueueName, ExchangeName, "wjire", null); //添加消费者
EventingBasicConsumer consumer = new EventingBasicConsumer(channel); //注册事件
consumer.Received += (s, e) =>
{
byte[] bytes = e.Body;
string str = Encoding.Default.GetString(bytes);
Console.WriteLine(" consumer2 : " + str);
}; //监听队列
channel.BasicConsume(QueueName, true, "", false, false, null, consumer);
}
}
运行结果:

可以看到,只有消费者2消费了消息.
RabbitMQ (六) 订阅者模式之路由模式 ( direct )的更多相关文章
- 路由器的nat模式、路由模式和全模式
NAT模式.此模式下,由局域网向广域网发送的数据包默认经过NAT转换,但路由器对所有源地址与局域网接口不在同一网段的数据包均不进行处理.例如,路由器LAN口IP设置为192.168.1.1,子网掩码为 ...
- RabbitMQ学习第四记:路由模式(direct)
1.什么是路由模式(direct) 路由模式是在使用交换机的同时,生产者指定路由发送数据,消费者绑定路由接受数据.与发布/订阅模式不同的是,发布/订阅模式只要是绑定了交换机的队列都会收到生产者向交换机 ...
- NAT模式、路由模式、桥接模式的区别
NAT模式 NAT模式概述 NAT是"Network Address Translation"的缩写,中文意思是"网络地址转换",它允许一个整体机构以一个公用I ...
- nat模式、路由模式,网桥模式
路由器的几种连接方式 NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Fo ...
- 【RabbitMQ】4、三种Exchange模式——订阅、路由、通配符模式
前两篇博客介绍了两种队列模式,这篇博客介绍订阅.路由和通配符模式,之所以放在一起介绍,是因为这三种模式都是用了Exchange交换机,消息没有直接发送到队列,而是发送到了交换机,经过队列绑定交换机到达 ...
- python使用rabbitMQ介绍四(路由模式)
一.模式介绍 路由模式,与发布-订阅模式一样,消息发送到exchange中,消费者把队列绑定到exchange上. 这种模式在exchange上添加添加了一个路由键(routing-key),生产者发 ...
- RabbitMQ (七) 订阅者模式之主题模式 ( topic )
主题模式和路由模式很像 路由模式是精确匹配 主题模式是模糊匹配 依然先通过管理后台添加一个交换机. 生产者 public class Producer { private const string E ...
- vue切换路由模式{hash/history}
vue中常用的路由模式 hash(#):默认路由模式 histroy(/)切换路由模式 切换路由模式 export default new Router({ // 路由模式:hash(默认),hist ...
- NAT模式/路由模式/全路由模式 (转)
route全路由NAT NAT模式.此模式下,由局域网向广域网发送的数据包默认经过NAT转换,但路由器对所有源地址与局域网接口不在同一网段的数据包均不进行处理.例如,路由器LAN口IP设置为192.1 ...
随机推荐
- [洛谷P1120]小木棍 [数据加强版]
题目大意:有一些同样长的木棍,被切割成几段(长$\leqslant$50).给出每段小木棍的长度,找出原始木棍的最小可能长度. 题解:dfs C++ Code: #include<cstdio& ...
- 【BZOI 1202 狡猾的商人】
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4149 Solved: 1994[Submit][Status][Discuss] Descript ...
- 解决Vue方法中setTimeout改变变量的值无效
把data里的变量继承过来重新封装一下 let that = this; this.rightAnswer = false; setTimeout(function() { that.rightAns ...
- 修改select样式,vue select
<style> .selectbox{ width: 200px; display: inline-block; overflow-x: hidden; height: 28px; lin ...
- dbcp重连问题排查
转载自:http://lc87624.iteye.com/blog/1734089 使用数据库连接池时,免不了会遇到断网.数据库挂掉等异常状况,当网络或数据库恢复时,若无法恢复连接池中的连接,那必然会 ...
- bzoj1862: [Zjoi2006]GameZ游戏排名系统
Description GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在世界上的排名.得分越高,排名就越靠前.当两个玩家的名次相同时 ...
- bzoj 1301 后缀数组
比较裸的后缀数组. /************************************************************** Problem: User: BLADEVIL La ...
- shell脚本之正则表达和文本处理(文本处理三剑客:1、grep 2、sed 3、awk)
文本处理三剑客:1.grep 2.sed 3.awk 一.grep:(过滤) grep的使用,主要的参数有: -n :显示行号:-o :只显示匹配的内容-q :静默模式,没有任何输出,得用e ...
- POJ1220(大数进制转换)
NUMBER BASE CONVERSION Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4652 Accepted: ...
- SuSE Linux修改网卡配置
http://blog.chinaunix.net/uid-20765159-id-1850854.html SuSE Linux修改网卡配置 2010 SuSE linux ...