即向多個消費者傳遞同一條資訊
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 ...