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.pswp.cn/news/275217.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275217.shtml
英文地址,請注明出處:http://en.pswp.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…

算法精講:分享一道值得分享的算法題

分享一道leetcode上的題&#xff0c;當然&#xff0c;居然不是放在刷題貼里來講&#xff0c;意味著分享的這道題不僅僅是教你怎么來解決&#xff0c;更重要的是這道題引發出來的一些解題技巧或許可以用在其他地方&#xff0c;下面我們來看看這道題的描述。 問題描述 給定一個未…

正幾邊形可以實現無縫拼接?

正n邊形內角為 (n-2)*180/n &#xff0c;要保證可以無縫拼接&#xff0c;就是一個圓可以被整數個n邊形內角拼接&#xff0c;即 360k*(n-2)*180/n > 2nk(n-2)。&#xff08;摘自http://blog.csdn.net/ray58750034/article/details/1365813&#xff09; 以下代碼表明&#xff…

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…

upc組隊賽15 Supreme Number【打表】

Supreme Number題目鏈接 題目描述 A prime number (or a prime) is a natural number greater than 1 that cannot be formed by multiplying two smaller natural numbers. Now lets define a number N as the supreme number if and only if each number made up of an non-e…

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在不同…

as3 淺復制 深復制

基元數據類型&#xff1a;boolean、int、uint、number、string 兩種復雜數據類型&#xff1a;array、object 當數組元素全部是基元數據類型時&#xff0c;即全部是值類型時&#xff0c;是沒有淺復制和深復制的區別。 當數組元素全部是復雜數據類型&#xff0c;即引用類型時&…

碎片化學前端,促進技術提升,我推薦這些

大家好&#xff0c;我是若川。眾所周知&#xff0c;關注公眾號可以了解學習掌握技術方向&#xff0c;學習優質好文&#xff0c;落實到自己項目中。還可以結交圈內好友&#xff0c;讓自己融入到積極上進的技術氛圍&#xff0c;促進自己的技術提升。話不多說&#xff0c;推薦這些…

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…

深度學習 Caffe 初始化流程理解(數據流建立)

之前在簡書的文章&#xff0c;搬遷過來 ^-^ 本文是作者原創&#xff0c;如有理解錯誤&#xff0c;懇請大家指出&#xff0c;如需引用&#xff0c;請注明出處。 #Caffe FeatureMap數據流的建立 ##用語解釋 FeatureMap: 輸入的圖片信息或者經過多層處理后的圖片信息。weights: 只…