【資料圖】
大家好,我是指北君。
今天指北君帶領大家接著學習RabbitMQ,了解RabbitMQ的五大通信模型之一的發布訂閱模型;接下來還會有關于RabbitMQ的系列教程,對你有幫助的話記得關注哦~
發布訂閱模型上一篇文章中,簡單的介紹了一下RabbitMQ的work模型。這篇文章來學習一下RabbitMQ中的發布訂閱模型。
發布訂閱模型(Publish/Subscribe):簡單的說就是隊列里面的消息會被多個消費者同時接受到,消費者接收到的信息一致。
發布訂閱模型適合于做模塊之間的異步通信。
適用場景發送并記錄日志信息springcloud的config組件里面通知配置自動更新緩存同步微信訂閱號演示生產者public class Producer { private static final String EXCHANGE_NAME = "exchange_publish_1"; public static void main(String[] args) throws IOException, TimeoutException { Connection connection = ConnectionUtils.getConnection(); Channel channel = connection.createChannel(); // 聲明交換機 channel.exchangeDeclare(EXCHANGE_NAME, "fanout"); // 發送消息到交換機 for (int i = 0; i < 100; i++) { channel.basicPublish(EXCHANGE_NAME, "", null, ("發布訂閱模型的第 " + i + " 條消息").getBytes()); } // 關閉資源 channel.close(); connection.close(); }}消費者
// 消費者1public class Consumer { private static final String QUEUE_NAME = "queue_publish_1"; private static final String EXCHANGE_NAME = "exchange_publish_1"; public static void main(String[] args) throws IOException, TimeoutException { Connection connection = ConnectionUtils.getConnection(); Channel channel = connection.createChannel(); // 聲明隊列 channel.queueDeclare(QUEUE_NAME, false, false, false, null); // 聲明交換機 channel.exchangeDeclare(EXCHANGE_NAME, "fanout"); // 將隊列綁定到交換機 channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ""); DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("隊列1接收到的消息是:" + new String(body)); } }; channel.basicConsume(QUEUE_NAME, true, defaultConsumer); }}
// 消費者2public class Consumer2 { private static final String QUEUE_NAME = "queue_publish_2"; private static final String EXCHANGE_NAME = "exchange_publish_1"; public static void main(String[] args) throws IOException, TimeoutException { Connection connection = ConnectionUtils.getConnection(); Channel channel = connection.createChannel(); // 聲明隊列 channel.queueDeclare(QUEUE_NAME, false, false, false, null); // 聲明交換機 channel.exchangeDeclare(EXCHANGE_NAME, "fanout"); // 將隊列綁定到交換機 channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ""); DefaultConsumer defaultConsumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("隊列2接收到的消息是:" + new String(body)); } }; channel.basicConsume(QUEUE_NAME, true, defaultConsumer); }}測試
先啟動2個消費者,再啟動生產者
?可以看出來消費者1和消費者2接收到的消息是一模一樣的,每個消費者都收到了生產者發送的消息;
發布訂閱模型,用到了一個新的東西-交換機,這里也解釋一下相關方法的參數:
// 聲明交換機channel.exchangeDeclare(EXCHANGE_NAME, "fanout");// 該方法的最多參數的重載方法是:Exchange.DeclareOk exchangeDeclare(String exchange, BuiltinExchangeType type, boolean durable, boolean autoDelete, boolean internal, Map // 將隊列綁定到交換機channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");/** * param1:destination,目的地,隊列的名字 * param2:source,資源,交換機的名字 * param3:routingKey,路由鍵(目前沒有用到routingKey,填 "" 即可) */小結 本文到這里就結束了,介紹了RabbitMQ通信模型中的發布訂閱模型,適合于做模塊之間的異步通信。
X 關閉
X 關閉
- 15G資費不大降!三大運營商誰提供的5G網速最快?中國信通院給出答案
- 2聯想拯救者Y70發布最新預告:售價2970元起 迄今最便宜的驍龍8+旗艦
- 3亞馬遜開始大規模推廣掌紋支付技術 顧客可使用“揮手付”結賬
- 4現代和起亞上半年出口20萬輛新能源汽車同比增長30.6%
- 5如何讓居民5分鐘使用到各種設施?沙特“線性城市”來了
- 6AMD實現連續8個季度的增長 季度營收首次突破60億美元利潤更是翻倍
- 7轉轉集團發布2022年二季度手機行情報告:二手市場“飄香”
- 8充電寶100Wh等于多少毫安?鐵路旅客禁止、限制攜帶和托運物品目錄
- 9好消息!京東與騰訊續簽三年戰略合作協議 加強技術創新與供應鏈服務
- 10名創優品擬通過香港IPO全球發售4100萬股 全球發售所得款項有什么用處?
