RabbitMQ指南之四:路由(Routing)和直连交换机(Direct Exchange)

  在上一章中,我们构建了一个简单的日志系统,我们可以把消息广播给很多的消费者。在本章中我们将增加一个特性:我们可以订阅这些信息中的一些信息。例如,我们希望只将error级别的错误存储到硬盘中,同时可以将所有级别(error、info、warning等)的日志都打印在控制台上。

1、绑定(Bindings)

  在上一章中,我们已经创建了绑定关系,回顾一下代码:

1 channel.queueBind(queueName, EXCHANGE_NAME, "");

  一个绑定是一个交换器与队列之间的关系。意思是指:这个队列对这个交换器的消息感兴趣。

  该方法同时还有另一个routing Key参数,为了避免与basic_public参数产生中的路由键(routing key)混淆,我们称之为绑定键(bingind key),下面展示了如何通过一个绑定key创建一个绑定:

1 channel.queueBind(queueName, EXCHANGE_NAME, "black");

  注意,这个绑定键(这里是"black")的含义依赖于交换器的类型。比如在我们的日志系统中,交换器类型为fanout,此时,绑定键没有任何意义,会被忽略掉。

2、直连交换机(Direct Exchange)

  在我们之前的日志系统中,所有的消息被广播给所有的消费者,但是本章的需要是希望有一个程序可以只接收error级别的日志并保存到磁盘中,而不用浪费空间去存储那些info、warning级别的日志。

  我们正在用的广播模式的交换器并不够灵活,它只是不加思索地进行广播。因此,需要使用direct exchange来代替。直连交换器的路由算法非常简单:将消息推送到binding key与该消息的routing key相同的队列。

  为了说明这点,请看下图:

  

  在该图中,直连交换器X上绑定了两个队列。第一个队列绑定了绑定键orange,第二个队列有两个绑定键:black和green。在这种场景下,一个消息在布时指定了路由键为orange将会只被路由到队列Q1,路由键为black和green的消息都将被路由到队列Q2。其他的消息都将被丢失。

3、多重绑定

  

  同一个绑定键可以绑定到不同的队列上去,在上图中,我们也可以增加一个交换器X与队列Q2的绑定键,在这种情况下,直连交换器将会和广播交换器有着相同的行为,将消息推送到所有匹配的队列。一个路由键为black的消息将会同时被推送到队列Q1和Q2。

4、发送日志

  首先我们要一如既往地创建一个交换器:

1 channel.exchangeDeclare(EXCHANGE_NAME, "direct");

  并准备发送消息:

1 channel.basicPublish(EXCHANGE_NAME, severity, null, message.getBytes());

  我们需要确保在我们日志系统中参数"severity"是“info”、“warning”和“error”中的一个。

5、订阅

  创建接收消息与上一章基本相同,唯一不同的是,需要在创建绑定关系时,指定severity的值:

1 String queueName = channel.queueDeclare().getQueue();
2 
3 for(String severity : argv){
4   channel.queueBind(queueName, EXCHANGE_NAME, severity);
5 }

6、完整的代码

  EmitLogDirect.java

 1 import com.rabbitmq.client.Channel;
 2 import com.rabbitmq.client.Connection;
 3 import com.rabbitmq.client.ConnectionFactory;
 4 
 5 public class EmitLogDirect {
 6 
 7   private static final String EXCHANGE_NAME = "direct_logs";
 8 
 9   public static void main(String[] argv) throws Exception {
10     ConnectionFactory factory = new ConnectionFactory();
11     factory.setHost("localhost");
12     try (Connection connection = factory.newConnection();
13          Channel channel = connection.createChannel()) {
14         channel.exchangeDeclare(EXCHANGE_NAME, "direct");
15 
16         String severity = getSeverity(argv);
17         String message = getMessage(argv);
18 
19         channel.basicPublish(EXCHANGE_NAME, severity, null, message.getBytes("UTF-8"));
20         System.out.println(" [x] Sent '" + severity + "':'" + message + "'");
21     }
22   }
23   //..
24 }

  ReceiveLogsDirect.java

 1 import com.rabbitmq.client.*;
 2 
 3 public class ReceiveLogsDirect {
 4 
 5   private static final String EXCHANGE_NAME = "direct_logs";
 6 
 7   public static void main(String[] argv) throws Exception {
 8     ConnectionFactory factory = new ConnectionFactory();
 9     factory.setHost("localhost");
10     Connection connection = factory.newConnection();
11     Channel channel = connection.createChannel();
12 
13     channel.exchangeDeclare(EXCHANGE_NAME, "direct");
14     String queueName = channel.queueDeclare().getQueue();
15 
16     if (argv.length < 1) {
17         System.err.println("Usage: ReceiveLogsDirect [info] [warning] [error]");
18         System.exit(1);
19     }
20 
21     for (String severity : argv) {
22         channel.queueBind(queueName, EXCHANGE_NAME, severity);
23     }
24     System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
25 
26     DeliverCallback deliverCallback = (consumerTag, delivery) -> {
27         String message = new String(delivery.getBody(), "UTF-8");
28         System.out.println(" [x] Received '" +
29             delivery.getEnvelope().getRoutingKey() + "':'" + message + "'");
30     };
31     channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });
32   }
33 }

  为了测试方便,我们可以把"info"、"error"、"warning"都绑定到一个队列上去,然后生产者分别往"info"、"error"、"warning"发送消息:

  此时查看RabbitMq控制台:

  

  到此,发布-订阅涉及到的相关知识点都讲解完了,下一章将讲解Topic(主题模式)。

 

转载于:https://www.cnblogs.com/wuhenzhidu/p/10801103.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不用任何插件实现 WordPress 的彩色标签云

侧边栏的标签云&#xff08;Tag Cloud&#xff09;一直是 WordPress 2.3 以后的内置功能&#xff0c;一般直接调用函数wp_tag_cloud 或者在 Widgets 里开启即可&#xff0c;但是默认的全部是一个颜色&#xff0c;只是大小不一样&#xff0c;很是不顺眼&#xff0c;虽然可以用 S…

随时随地能写代码, vscode.dev 出手了

大家好&#xff0c;我是若川。最近组织了源码共读活动&#xff0c;感兴趣的可以加我微信 ruochuan12 参与。今天偶然看到了 VSCode 官方发布了一条激动人心的 Twitter&#xff0c;vscode.dev[1] 域名上线了&#xff01;image-20211021211915942新的域名 vscode.dev[2] 它是一个…

七种主流设计风格_您是哪种设计风格?

七种主流设计风格重点 (Top highlight)I had an idea for another mindblowing test, so here it is. Since you guys liked the first one so much, and I got so many nice, funny responses and private messages on how accurate it actually was, I thought you will prob…

React 18 Beta 来了

大家好&#xff0c;我是若川。最近组织了源码共读活动&#xff0c;感兴趣的可以加我微信 ruochuan12 参与&#xff0c;目前近3000人参与。经过「React18工作组」几个月工作&#xff0c;11月16日v18终于从Alpha版本更新到Beta版本。本文会解释&#xff1a;这次更新带来的变化对开…

osg着色语言着色_探索数字着色

osg着色语言着色Learn how to colorize icons with your NounPro subscription and Adobe Illustrator.了解如何使用NounPro订阅和Adobe Illustrator为图标着色。 For those who want to level up their black and white Noun Project icons with a splash of color, unlockin…

CSS3实践之路(一):CSS3之我观

CSS 的英文全称Cascading Style Sheets&#xff0c;中文意思是级联样式表,通过设立样式表&#xff0c;可以统一地控制HMTL中各DOM元素的显示属性。级联样式表可以使人更能有效地控制网页外观。使用级联样式表&#xff0c;可以扩充精确指定网页元素位置&#xff0c;外观以及创建…

18个项目必备的JavaScript代码片段——数组篇

大家好&#xff0c;我是若川。最近组织了源码共读活动&#xff0c;感兴趣的可以加我微信 ruochuan12 参与&#xff0c;目前近3000人参与&#xff0c;0-5年工作经验的都可以参与学习。1.chunk转换二维数组将数组&#xff08;array&#xff09;拆分成多个数组&#xff0c;并将这些…

美学评价_卡美学的真正美

美学评价In collectible card games like Hearthstone, Legends of Runeterra, and Magic: The Gathering, the aesthetic of the cards is indubitably one of the greatest highlights for many, if not all players. Although the game loop is reliant on physically build…

好程序员web前端分享CSS Bug、CSS Hack和Filter学习笔记

为什么80%的码农都做不了架构师&#xff1f;>>> CSS Bug、CSS Hack和Filter学习笔记 1)CSS Bug:CSS样式在各浏览器中解析不一致的情况&#xff0c;或者说CSS样式在浏览器中不能正确显示的问题称为CSS bug. 2)CSS Hack: CSS中&#xff0c;Hack是指一种兼容CSS在不同…

ux和ui_设计更好的结帐体验-UX / UI案例研究

ux和uiPlated Cuisine is a food ordering and delivery app for Plated Cuisine Restaurant founded and managed by Rayo Odusanya.Plated Cuisine是由Rayo Odusanya创建和管理的Plated Cuisine Restaurant的食品订购和交付应用程序。 A short background about Rayo Rayo O…

Django中ajax发送post请求,报403错误CSRF验证失败解决办法

今天学习Django框架&#xff0c;用ajax向后台发送post请求&#xff0c;直接报了403错误&#xff0c;说CSRF验证失败&#xff1b;先前用模板的话都是在里面加一个 {% csrf_token %} 就直接搞定了CSRF的问题了&#xff1b;很显然&#xff0c;用ajax发送post请求这样就白搭了&…

如何在EXCEL中添加下拉框

筛选主要是将已有列的信息以下拉框的形式显示出来 选中数据栏中的筛选按钮即可生成 如果是想添加未有信息则如下图步骤 首先&#xff0c;选择你要出现下拉的区域&#xff0c;在数据栏中的选择数据有效性 然后&#xff0c;下面对话框中&#xff0c;有效性条件中按如下设置即可&a…

每次新增页面复制粘贴?100多行源码的 element-ui 的新增组件功能教你解愁

1. 前言大家好&#xff0c;我是若川。最近组织了源码共读活动&#xff0c;感兴趣的可以点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。已进行三个月了&#xff0c;很多小伙伴表示收获颇丰。想学源码&#xff0c;极力推荐之前我…

原子设计_您需要了解的有关原子设计的4件事

原子设计重点 (Top highlight)Industries such as Architecture or Industrial Design have developed smart modular systems for manufacturing extremely complex objects like airplanes, ships, and skyscrapers. Inspired by this, Atomic Design was proposed as a syst…

C#中的Clipboard与ContextMenuStrip应用举例

今天&#xff0c;突然想起了怎样在一个文本中实现复制、剪切与粘贴的功能&#xff0c;并给这些功能添加右键的快捷方式。于是&#xff0c;就用自己的VS2008写了一个简单的小应用&#xff0c;以熟悉C#中剪贴板与快捷菜单的使用。 首先&#xff0c;我们不难发现&#xff0c;剪贴板…

控制台ui_设计下一代控制台UI

控制台ui游戏UX (GAMES UX) Yesterday’s Sony presentation showed us the final look of the PlayStation 5, as well as an impressive of next-gen games that will be released with it. What we didn’t get to see, however, is the new operating system and it’s use…

写给前端新手看的一些模块化知识

大家好&#xff0c;我是若川。最近组织了源码共读活动&#xff0c;感兴趣的可以点此加我微信ruochuan12 进群参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。已进行三个月了&#xff0c;很多小伙伴表示收获颇丰。一、 为什么需要模块化以前没有模块化时…

代码实现照片素描_我的代码素描之旅

代码实现照片素描In 2018 I started the process of consistently creating and posting my code sketches online. These are small animations I make with code and post on instagram. Through these sketches I tried to visually express my ideas using color, animatio…

真效率神器,UI稿智能转换成前端代码,准确率极高

大家好&#xff0c;我是若川。在这充满网络促销活动的几个月&#xff0c;倍感压力的&#xff0c;除了你的口袋&#xff0c;是否还有程序员的发量呢&#xff1f;每年的双十一、双十二购物狂欢节&#xff0c;各大电商平台都会上线让消费者充满购买欲望的活动页面&#xff0c;而这…

几个用于序列化的代码片段

参考JavaScriptSerializer,一般用来做JSON格式化http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer.aspx http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptconverter.aspxDataContractSeria…