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

这里,我们改变一下声明交换机的方式.

我们通过管理后台添加一个交换机.

添加后,生产者和消费者的代码中就不需要再声明交换机了.同样,也可以通过管理后台添加队列,那么代码中也不需要声明队列了.

生产者

  1. public class Producer
  2. {
  3.  
  4. private const string ExchangeName = "test_exchange_direct";
  5.  
  6. public static void Send()
  7. {
  8. IConnection connection = ConnectionHelper.GetConnection();
  9. IModel channel = connection.CreateModel();
  10. string msg = "hello world ";
  11.  
  12. //把消息发送到交换机,交换机再转发到包含路由键"refuge"的队列.
  13. channel.BasicPublish(ExchangeName, "refuge", null, Encoding.Default.GetBytes(msg));
  14. Console.WriteLine($"send {msg}");
  15.  
  16. channel.Close();
  17. connection.Close();
  18. }
  19. }

消费者1

  1. public class Consumer1
  2. {
  3. private const string QueueName = "test_exchange1_queue";
  4. private const string ExchangeName = "test_exchange_direct";
  5.  
  6. public static void Receive()
  7. {
  8. //获取连接
  9. RabbitMQ.Client.IConnection connection = ConnectionHelper.GetConnection();
  10.  
  11. //创建通道
  12. RabbitMQ.Client.IModel channel = connection.CreateModel();
  13.  
  14. //声明队列
  15. channel.QueueDeclare(QueueName, false, false, false, null);
  16.  
  17. //声明交换机
  18. //channel.ExchangeDeclare(ExchangeName, "direct", false, false, null);
  19.  
  20. //将队列绑定到交换机上,路由键为"wjire"
  21. channel.QueueBind(QueueName, ExchangeName, "wjire", null);
  22.  
  23. //添加消费者
  24. EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
  25.  
  26. //注册事件
  27. consumer.Received += (s, e) =>
  28. {
  29. byte[] bytes = e.Body;
  30. string str = Encoding.Default.GetString(bytes);
  31. Console.WriteLine("consumer1 : " + str);
  32. };
  33.  
  34. //监听队列
  35. channel.BasicConsume(QueueName, true, "", false, false, null, consumer);
  36. }
  37. }

消费者2

  1. public class Consumer2
  2. {
  3. private const string QueueName = "test_exchange2_queue";
  4. private const string ExchangeName = "test_exchange_direct";
  5. public static void Receive()
  6. {
  7. //获取连接
  8. RabbitMQ.Client.IConnection connection = ConnectionHelper.GetConnection();
  9.  
  10. //创建通道
  11. RabbitMQ.Client.IModel channel = connection.CreateModel();
  12.  
  13. //声明队列
  14. channel.QueueDeclare(QueueName, false, false, false, null);
  15.  
  16. //声明交换机
  17. //channel.ExchangeDeclare(ExchangeName, "direct", false, false, null);
  18.  
  19. //将队列绑定到交换机上,该队列匹配两个路由键,"refuge"和"wjire"
  20. channel.QueueBind(QueueName, ExchangeName, "refuge", null);
  21. channel.QueueBind(QueueName, ExchangeName, "wjire", null);
  22.  
  23. //添加消费者
  24. EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
  25.  
  26. //注册事件
  27. consumer.Received += (s, e) =>
  28. {
  29. byte[] bytes = e.Body;
  30. string str = Encoding.Default.GetString(bytes);
  31. Console.WriteLine(" consumer2 : " + str);
  32. };
  33.  
  34. //监听队列
  35. channel.BasicConsume(QueueName, true, "", false, false, null, consumer);
  36. }
  37. }

运行结果:

可以看到,只有消费者2消费了消息.

RabbitMQ (六) 订阅者模式之路由模式 ( direct )的更多相关文章

  1. 路由器的nat模式、路由模式和全模式

    NAT模式.此模式下,由局域网向广域网发送的数据包默认经过NAT转换,但路由器对所有源地址与局域网接口不在同一网段的数据包均不进行处理.例如,路由器LAN口IP设置为192.168.1.1,子网掩码为 ...

  2. RabbitMQ学习第四记:路由模式(direct)

    1.什么是路由模式(direct) 路由模式是在使用交换机的同时,生产者指定路由发送数据,消费者绑定路由接受数据.与发布/订阅模式不同的是,发布/订阅模式只要是绑定了交换机的队列都会收到生产者向交换机 ...

  3. NAT模式、路由模式、桥接模式的区别

    NAT模式 NAT模式概述 NAT是"Network Address Translation"的缩写,中文意思是"网络地址转换",它允许一个整体机构以一个公用I ...

  4. nat模式、路由模式,网桥模式

    路由器的几种连接方式 NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Fo ...

  5. 【RabbitMQ】4、三种Exchange模式——订阅、路由、通配符模式

    前两篇博客介绍了两种队列模式,这篇博客介绍订阅.路由和通配符模式,之所以放在一起介绍,是因为这三种模式都是用了Exchange交换机,消息没有直接发送到队列,而是发送到了交换机,经过队列绑定交换机到达 ...

  6. python使用rabbitMQ介绍四(路由模式)

    一.模式介绍 路由模式,与发布-订阅模式一样,消息发送到exchange中,消费者把队列绑定到exchange上. 这种模式在exchange上添加添加了一个路由键(routing-key),生产者发 ...

  7. RabbitMQ (七) 订阅者模式之主题模式 ( topic )

    主题模式和路由模式很像 路由模式是精确匹配 主题模式是模糊匹配 依然先通过管理后台添加一个交换机. 生产者 public class Producer { private const string E ...

  8. vue切换路由模式{hash/history}

    vue中常用的路由模式 hash(#):默认路由模式 histroy(/)切换路由模式 切换路由模式 export default new Router({ // 路由模式:hash(默认),hist ...

  9. NAT模式/路由模式/全路由模式 (转)

    route全路由NAT NAT模式.此模式下,由局域网向广域网发送的数据包默认经过NAT转换,但路由器对所有源地址与局域网接口不在同一网段的数据包均不进行处理.例如,路由器LAN口IP设置为192.1 ...

随机推荐

  1. [CF1041E]Tree Reconstruction

    题目大意:有一棵树,现在给你每条树边被去掉时,形成的两个联通块中点的最大的编号分别是多少,问满足条件的树存不存在,存在输出方案 题解:一条边的两个编号中较大的一个一定是$n$,否则无解. 开始构造这棵 ...

  2. bzoj1814 Ural 1519 Formula 1(插头dp模板题)

    1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 924  Solved: 351[Submit][Sta ...

  3. TCP ------ TCP四次挥手(断开连接)及断开过程

    1.正常情况下,调用close(),产生的其中一个效果就是发送FIN,只有双方都调用close(),才会出现正常的四次挥手. 2.如果是服务器,发起四次挥手是在关闭accept()返回的套接字,而不是 ...

  4. python爬取七星彩的开奖历史记录

    1.因为人不可能一直无休止的学习,偶尔也想做点儿别的,昨天无聊就想写写Python,当然我承认我上班后基本都是在学工作方面的事情,在这个岗位我也呆了三年多了,还是那句话问我什么会不会我会给你说我啥都会 ...

  5. Hibernate 三种状态变化 与 sql 语句的关系

    前言:在Hibernate中有三种状态,对它的深入理解,才能更好的理解hibernate的运行机理,刚开始不太注意这些概念,后来发现它是重要的.对于理解hibernate,JVM和sql的关系有更好的 ...

  6. 河南省第十届省赛 Plumbing the depth of lake (模拟)

    title: Plumbing the depth of lake 河南省第十届省赛 题目描述: There is a mysterious lake in the north of Tibet. A ...

  7. [Leetcode Week5]Word Ladder II

    Word Ladder II 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/word-ladder-ii/description/ Descripti ...

  8. RabbitMQ消息队列(三): 发布/订阅

    1. 订阅/发布: 前面worker示例中的每个任务都是只发送给某一个worker,如果我们多个worker都需要接收处理同一个任务,此时就要使用 订阅/发布功能,比如,日志模块产生日志并发送到队列中 ...

  9. kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数

    第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一 ...

  10. Map、Set、List初始化大小的影响

    import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Lis ...