RabbitMQ 04 訂閱模式 路由模式

2021-10-22 19:32:44 字數 2944 閱讀 4104

即向多個消費者傳遞同一條資訊

1).exchanges 交換機

rabbitmq訊息傳遞模型的核心思想是,生產者永遠不會將任何訊息直接傳送到佇列。

相反,生產者只能向交換機(exchange)傳送訊息。交換機是乙個非常簡單的東西。一邊接收來自生產者的訊息,另一邊將訊息推送到佇列。交換器必須確切地知道如何處理它接收到的訊息。它應該被新增到乙個特定的佇列中嗎?它應該新增到多個佇列中嗎?或者它應該被丟棄。這些規則由exchange的型別定義。

有幾種可用的交換型別:direct、topic、header和fanout

建立fanout交換機logs:c.exchangedeclare("logs", "fanout");

c.exchangedeclare("logs", builtinexchangetype.fanout);

fanout交換機非常簡單。它只是將接收到的所有訊息廣播給它所知道的所有佇列。

2).繫結 bindings

建立了乙個fanout交換機和乙個佇列。現在我們需要告訴exchange向指定佇列傳送訊息。exchange和佇列之間的關係稱為繫結。

//指定的佇列,與指定的交換機關聯起來

//稱為繫結 -- binding

//第三個引數時 routingkey, 由於是fanout交換機, 這裡忽略 routingkey

ch.queuebind(queuename, "logs", "");

3).整體**

1.生產者

最重要的更改是,我們現在希望將訊息發布到logs交換機,而不是無名的日誌交換機。我們需要在傳送時提供乙個routingkey,但是對於fanout交換機型別,該值會被忽略。

public class producer }}

2.消費者

如果還沒有佇列繫結到交換器,訊息就會丟失,但這對我們來說沒有問題;如果還沒有消費者在聽,我們可以安全地丟棄這些資訊。

public class consumer 

};cancelcallback cancelcallback = new cancelcallback()

};//正常的消費資料

c.basicconsume(queue,

true, delivercallback,

cancelcallback);

}}

路由模式與訂閱模式不同之處在於,我們將向其新增乙個特性—我們將只訂閱所有訊息中的一部分.本文中已新增err/info/warning等報錯提示來示範.

1).繫結 bindings

繫結是交換機和佇列之間的關係。這可以簡單地理解為:佇列對來自此交換的訊息感興趣。

繫結可以使用額外的routingkey引數。為了避免與basic_publish引數混淆,我們將其稱為bindingkey。這是我們如何建立乙個鍵繫結:

ch.queuebind(queuename, exchange_name, "black");
bindingkey的含義取決於交換機型別。我們前面使用的fanout交換機完全忽略它。

2).直連交換機 direct exchange

上一節中的日誌系統向所有消費者廣播所有訊息。我們希望擴充套件它,允許根據訊息的嚴重性過濾訊息。

前面我們使用的是fanout交換機,這並沒有給我們太多的靈活性——它只能進行簡單的廣播。

我們將用直連交換機(direct exchange)代替。它背後的路由演算法很簡單——訊息傳遞到bindingkey與routingkey完全匹配的佇列。

3).多重繫結 multiple bindings

使用相同的bindingkey繫結多個佇列是完全允許的。可以使用binding key "black"將x與q1和q2繫結。在這種情況下,直連交換機的行為類似於fanout,並將訊息廣播給所有匹配的佇列。一條路由鍵為black的訊息將同時傳送到q1和q2。

4).更改

1.傳送訊息

我們將提供日誌級別作為routingkey,這樣,接收程式將能夠選擇它希望接收的級別

//引數1: 交換機名

//引數2: routingkey, 路由鍵,這裡我們用日誌級別,如"error","info","warning"

//引數3: 其他配置屬性

//引數4: 發布的訊息資料

ch.basicpublish("direct_logs", "error", null, message.getbytes());

2.接收訊息

我們將為感興趣的每個日誌級別建立乙個新的繫結

ch.queuebind(queuename, "logs", "info");

ch.queuebind(queuename, "logs", "warning");

5).完整**

1.生產者

public class producer }}

2.消費者

public class consumer 

delivercallback delivercallback = new delivercallback()

};cancelcallback cancelcallback = new cancelcallback()

};//正常的消費資料

c.basicconsume(queue,

true, delivercallback,

cancelcallback);

}}

rabbitmq 發布訂閱模式

上篇我們已經講過了工作模式和簡單模式的用法。而這節我們就要開始講一下後面三種的第一種,在我們平常開發中,其實用的比較多的是後面的這三種。發布訂閱模式 英文叫publish subscribe,發布訂閱模式也稱為廣播模式,在exchange下屬於fanout模式。廣播,大家應該都知道吧,在mq中,其實...

RabbitMQ之訂閱模式

rabbitmq之訂閱模式簡介 乙個生產者,多個消費者 每乙個消費者都有自己的佇列 生產者沒有直接將訊息傳送到佇列中去,而是傳送到了交換機或者 器 exchange 中 每個佇列都要繫結到交換機上 生產者傳送的訊息,經過互動機到達佇列就能實現乙個訊息被多個消費者消費 參考 生產者 訂閱模式 auth...

RabbitMQ發布 訂閱模式

1 生產者 package com.ys.ps import com.rabbitmq.client.channel import com.rabbitmq.client.connection import com.ys.utils.connectionutil create by ysocean ...