日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】RabbitMQ六种队列模式-4.路由模式

發(fā)布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】RabbitMQ六种队列模式-4.路由模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

RabbitMQ六種隊列模式-簡單隊列
RabbitMQ六種隊列模式-工作隊列
RabbitMQ六種隊列模式-發(fā)布訂閱
RabbitMQ六種隊列模式-路由模式?[本文]
RabbitMQ六種隊列模式-主題模式

本文帶大家了解 RabbitMQ 隊列模式中的路由模式。

其實只要看過上篇發(fā)布模式后,相信路由模式上手就非常 easy 了,唯一差距就是兩個參數,exchange類型和 routingKey 。

文章目錄

1. 什么是路由模式2. 代碼部分2.1 日志生產者2.2 info消費者2.3 error消費者2.4 運行截圖3. 路由模式總結

1. 什么是路由模式

官網鏈接:https://msd.misuland.com/pd/2884250137616455578

路由模式跟發(fā)布訂閱模式類似,然后在訂閱模式的基礎上加上了類型,訂閱模式是分發(fā)到所有綁定到交換機的隊列,路由模式只分發(fā)到綁定在交換機上面指定路由鍵的隊列,我們可以看一下下面這張圖:

P 表示為生產者、 X 表示交換機、C1C2 表示為消費者,紅色表示隊列。

上圖是一個結合日志消費級別的配圖,在路由模式它會把消息路由到那些 binding key 與 routing key 完全匹配的 Queue 中,此模式也就是 Exchange 模式中的 direct 模式。

以上圖的配置為例,我們以 routingKey="error" 發(fā)送消息到 Exchange,則消息會路由到Queue1(amqp.gen-S9b…,這是由RabbitMQ自動生成的Queue名稱)和Queue2(amqp.gen-Agl…)。如果我們以 routingKey="info" 或 routingKey="warning" 來發(fā)送消息,則消息只會路由到 Queue2。如果我們以其他 routingKey 發(fā)送消息,則消息不會路由到這兩個 Queue 中。

相對于發(fā)布訂閱模式,我們可以看到不再是廣播似的接收全部消息,而是有選擇性的消費。

我們就以接收不同日志級別的隊列為例吧。

2. 代碼部分

2.1 日志生產者

public?class?ProdecerRouting?{private?static?final?String?EXCHANGE_NAME?=?"my_fanout_exchange";public?static?void?main(String[]?args)?throws?IOException,?TimeoutException?{/**?1.創(chuàng)建新的連接?*/Connection?connection?=?MQConnectionUtils.newConnection();/**?2.創(chuàng)建通道?*/Channel?channel?=?connection.createChannel();/**?3.綁定的交換機?參數1交互機名稱?參數2?exchange類型?*/channel.exchangeDeclare(EXCHANGE_NAME,?"direct");/**?4.發(fā)送消息?*/String?message?=?"",sendType="";for?(int?i?=?0;?i?<?10;?i++){if(i%2==0){sendType?=?"info";message?=?"我是?info?級別的消息類型:"?+?i;}else{sendType?=?"error";message?=?"我是?error?級別的消息類型:"?+?i;}System.out.println("[send]:"?+?message?+?"??"?+sendType);channel.basicPublish(EXCHANGE_NAME,?sendType,?null,?message.getBytes("utf-8"));try?{Thread.sleep(5?*?i);}?catch?(InterruptedException?e)?{e.printStackTrace();}}/**?5.關閉通道、連接?*/channel.close();connection.close();/**?注意:如果消費沒有綁定交換機和隊列,則消息會丟失?*/}}

注意:exchangeDeclare() 方法 exchange 類型為 direct

2.2 info消費者

public?class?ConsumerInfo?{private?static?final?String?QUEUE_NAME?=?"consumer_info";private?static?final?String?EXCHANGE_NAME?=?"my_fanout_exchange";public?static?void?main(String[]?args)?throws?IOException,?TimeoutException?{System.out.println("info消費者啟動");/*?1.創(chuàng)建新的連接?*/Connection?connection?=?MQConnectionUtils.newConnection();/*?2.創(chuàng)建通道?*/Channel?channel?=?connection.createChannel();/*?3.消費者關聯(lián)隊列?*/channel.queueDeclare(QUEUE_NAME,?false,?false,?false,?null);/*?4.消費者綁定交換機?參數1?隊列?參數2交換機?參數3?routingKey?*/channel.queueBind(QUEUE_NAME,?EXCHANGE_NAME,?"info");DefaultConsumer?consumer?=?new?DefaultConsumer(channel)?{@Overridepublic?void?handleDelivery(String?consumerTag,?Envelope?envelope,?AMQP.BasicProperties?properties,?byte[]?body)throws?IOException?{String?msg?=?new?String(body,?"UTF-8");System.out.println("消費者獲取生產者消息:"?+?msg);}};/*?5.消費者監(jiān)聽隊列消息?*/channel.basicConsume(QUEUE_NAME,?true,?consumer);}}

2.3 error消費者

public?class?ConsumerError?{private?static?final?String?QUEUE_NAME?=?"consumer_error";private?static?final?String?EXCHANGE_NAME?=?"my_fanout_exchange";public?static?void?main(String[]?args)?throws?IOException,?TimeoutException?{System.out.println("error消費者啟動");/*?1.創(chuàng)建新的連接?*/Connection?connection?=?MQConnectionUtils.newConnection();/*?2.創(chuàng)建通道?*/Channel?channel?=?connection.createChannel();/*?3.消費者關聯(lián)隊列?*/channel.queueDeclare(QUEUE_NAME,?false,?false,?false,?null);/*?4.消費者綁定交換機?參數1?隊列?參數2交換機?參數3?routingKey?*/channel.queueBind(QUEUE_NAME,?EXCHANGE_NAME,?"error");DefaultConsumer?consumer?=?new?DefaultConsumer(channel)?{@Overridepublic?void?handleDelivery(String?consumerTag,?Envelope?envelope,?AMQP.BasicProperties?properties,?byte[]?body)throws?IOException?{String?msg?=?new?String(body,?"UTF-8");System.out.println("消費者獲取生產者消息:"?+?msg);}};/*?5.消費者監(jiān)聽隊列消息?*/channel.basicConsume(QUEUE_NAME,?true,?consumer);}}

2.4 運行截圖

先運行兩個消費者,再運行生產者。如果沒有提前將隊列綁定到交換機,那么直接運行生產者的話,消息是不會發(fā)到任何隊列里的。

生產者

info消費者

error消費者

3. 路由模式總結

1、兩個隊列消費者設置的路由不一樣,接收到的消息就不一樣。路由模式下,決定消息向隊列推送的主要取決于路由,而不是交換機了。  

2、該模式必須設置交換機,且聲明路由模式?channel.exchangeDeclare(EXCHANGE_NAME, "direct");

生產者發(fā)送消息到交換機,同時定義了一個路由 routingKey,多個消費者聲明多個隊列,與交換機進行綁定,同時定義路由 routingKey,只有路由 routingKey相同的消費者才能消費數據

案例代碼:https://www.lanzous.com/i5ydu6d

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的【转】RabbitMQ六种队列模式-4.路由模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。