RabbitMQ 實戰教程(四) 路由

2021-09-13 02:48:06 字數 3303 閱讀 4846

channel.queuebind(queuename, exchange_name, "");
繫結是建立交換器和佇列之間的關係。這可以簡單地理解:佇列對該交換器上的訊息感興趣。

為了避免與 basicpublish 方法的引數混淆,我們將其稱為繫結鍵。下面是我們如何用乙個繫結鍵建立乙個繫結:

channel.queuebind(queuename, exchange_name, "black");
繫結鍵的意義依賴於交換器的型別。以前我們以前使用的 fanout 型別的交換器可以忽略此引數。

我們從上乙個教程的日誌記錄系統向所有消費者廣播所有訊息。現在,我們需要乙個將錯誤日誌訊息寫入磁碟,而不會把硬碟空間浪費警告或訊息型別日誌訊息上。

其中,第乙個佇列與繫結鍵 orange 繫結,第二個佇列有兩個繫結,乙個繫結鍵為 black,另乙個繫結為 green。在這樣的設定中,具有 orange 的交換器的訊息將被路由到佇列 q1。具有 black 或 green 的交換器的訊息將轉到 q2。所有其他訊息將被丟棄。

此外,使用相同的繫結鍵繫結多個佇列是完全合法的。在我們的示例中,我們可以在 x 和 q1 之間新增繫結鍵 black。在這種情況下,direct 型別的交換器將訊息廣播到所有匹配的佇列 q1 和 q2。

我們將使用 direct 型別的交換器進行日誌記錄系統。

channel.exchangedeclare(exchange_name, "direct");
現在,我們準備傳送一條訊息:

channel.basicpublish(exchange_name, severity, null, message.getbytes());
為了簡化**,我們假定 『severity』 是 『info』, 『warning』, 『error』 中的乙個。

接收訊息將像上乙個教程一樣工作,除了乙個例外 – 我們給我們所感興趣的嚴重性型別的日誌建立乙個繫結。

傳送端,連線到 rabbitmq,傳送一條資料,然後退出。

public class emitlogdirect ;  

public static void main(string args) throws ioexception, timeoutexception

// 關閉頻道和連線

channel.close();

connection.close();}}

接受端,不斷等待伺服器推送訊息,然後在控制台輸出。

public class receivelogsdirect ;  

public static void main(string args) throws ioexception, timeoutexception

};channel.basicconsume(queuename, true, consumer);}}

現在,做乙個實驗,我們開啟三個 receivelogsdirect 工作程式:receivelogsdirect1 、receivelogsdirect2 與 receivelogsdirect3。

receivelogsdirect1

[*] waiting for messages. to exit press ctrl+c

[*] log level : info

[x] received 'liang-msg log : [info]0dd0ae0c-bf74-4aa9-9852-394e65fbf939'

[x] received 'liang-msg log : [info]b2b032f6-e907-4c95-b676-1790204c5f73'

[x] received 'liang-msg log : [info]14482461-e432-4866-9eb5-a28f4edeb47f'

receivelogsdirect2

[*] waiting for messages. to exit press ctrl+c

[*] log level : error

[x] received 'liang-msg log : [error]493dce2a-7ce1-4111-953c-99ab2564a2d0'

[x] received 'liang-msg log : [error]2446dd80-d5f0-4d39-888f-31579b9d2724'

[x] received 'liang-msg log : [error]fe8219e0-5548-40ba-9810-d922d1b03dd8'

[x] received 'liang-msg log : [error]797b6d0e-9928-4505-9c76-56043322b1f0'

receivelogsdirect3

[*] waiting for messages. to exit press ctrl+c

[*] log level : debug

[x] received 'liang-msg log : [debug]c05eee3e-b820-4b69-9c3f-c2bbded85195'

[x] received 'liang-msg log : [debug]4645c9ba-4070-41d7-adc9-7f8b2df1e3c8'

[x] received 'liang-msg log : [debug]d3d3ad5c-8f97-49ea-8fd6-c434790e40eb'

此時,receivelogsdirect1 、receivelogsdirect2 與 receivelogsdirect3 同時收到了屬於自己級別的訊息。

相關示例完整**: 

RabbitMQ官網教程4 路由

前面的章節我們建立了乙個簡單的日誌系統,可以把訊息廣播到許多接收者。本節我們將增加乙個特性 只訂閱一部分訊息。比如只把錯誤日誌輸出到檔案,同時把所有日誌輸出到螢幕。繫結 前面的例子裡我們已經建立過繫結。繫結就是交換機和佇列間的一種關係,簡單解讀為佇列關注該交換機的訊息。建立繫結時可以增加乙個引數ro...

RabbitMQ 原文譯04 路由

在前一篇文章中我們構建了乙個簡單的日誌系統,我們可以向多個接受者廣播訊息。在這篇文章我,我們將要新增一些功能使得針對部分訊息的接受成為可能,例如我們只對錯誤的訊息進行磁碟記錄,同時又可以把所有的訊息列印到螢幕上。在之前的案例中,我們已經建立了乙個繫結,可以重新呼叫如下的 channel.queueb...

從零開始Vue專案實戰(四) 路由

傳統的頁面應用,是用一些超連結來實現頁面切換和跳轉的。而vue的單頁面應用是基於路由和元件的,路由用於設定訪問路徑,並將路徑和元件對映起來。路由中有三個基本的概念 route,routes,router。1,route,它是一條路由,由這個英文單詞也可以看出來,它是單數,home按鈕 home內容,...