rabbitmq direct 多個消費者_一文解析 RabbitMQ 最常用的三大模式

326b7a263b51ee38b3ad551ea36120ce.png

Direct 模式

  • 所有發送到 Direct Exchange 的消息被轉發到 RouteKey 中指定的 Queue。
  • Direct 模式可以使用 RabbitMQ 自帶的 Exchange: default Exchange,所以不需要將 Exchange 進行任何綁定(binding)操作。
  • 消息傳遞時,RouteKey 必須完全匹配才會被隊列接收,否則該消息會被拋棄,

ad388b7026de605ce5d8e21b2535345c.png
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class DirectProducer {public static void main(String[] args) throws Exception {//1. 創建一個 ConnectionFactory 并進行設置ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setVirtualHost("/");factory.setUsername("guest");factory.setPassword("guest");//2. 通過連接工廠來創建連接Connection connection = factory.newConnection();//3. 通過 Connection 來創建 ChannelChannel channel = connection.createChannel();//4. 聲明String exchangeName = "test_direct_exchange";String routingKey = "item.direct";//5. 發送String msg = "this is direct msg";channel.basicPublish(exchangeName, routingKey, null, msg.getBytes());System.out.println("Send message : " + msg);//6. 關閉連接channel.close();connection.close();}
}
import com.rabbitmq.client.*;
import java.io.IOException;public class DirectConsumer {public static void main(String[] args) throws Exception {//1. 創建一個 ConnectionFactory 并進行設置ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setVirtualHost("/");factory.setUsername("guest");factory.setPassword("guest");factory.setAutomaticRecoveryEnabled(true);factory.setNetworkRecoveryInterval(3000);//2. 通過連接工廠來創建連接Connection connection = factory.newConnection();//3. 通過 Connection 來創建 ChannelChannel channel = connection.createChannel();//4. 聲明String exchangeName = "test_direct_exchange";String queueName = "test_direct_queue";String routingKey = "item.direct";channel.exchangeDeclare(exchangeName, "direct", true, false, null);channel.queueDeclare(queueName, false, false, false, null);//一般不用代碼綁定,在管理界面手動綁定channel.queueBind(queueName, exchangeName, routingKey);//5. 創建消費者并接收消息Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body)throws IOException {String message = new String(body, "UTF-8");System.out.println(" [x] Received '" + message + "'");}};//6. 設置 Channel 消費者綁定隊列channel.basicConsume(queueName, true, consumer);}
}
Send message : this is direct msg[x] Received 'this is direct msg'
Topic 模式

Topic 模式

可以使用通配符進行模糊匹配

  • 符號'#" 匹配一個或多個詞
  • 符號"*”匹配不多不少一個詞

例如:

  • 'log.#"能夠匹配到'log.info.oa"
  • "log.*"只會匹配到"log.erro“

b39cb721a3040fd71aac40aee017256e.png
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class TopicProducer {public static void main(String[] args) throws Exception {//1. 創建一個 ConnectionFactory 并進行設置ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setVirtualHost("/");factory.setUsername("guest");factory.setPassword("guest");//2. 通過連接工廠來創建連接Connection connection = factory.newConnection();//3. 通過 Connection 來創建 ChannelChannel channel = connection.createChannel();//4. 聲明String exchangeName = "test_topic_exchange";String routingKey1 = "item.update";String routingKey2 = "item.delete";String routingKey3 = "user.add";//5. 發送String msg = "this is topic msg";channel.basicPublish(exchangeName, routingKey1, null, msg.getBytes());channel.basicPublish(exchangeName, routingKey2, null, msg.getBytes());channel.basicPublish(exchangeName, routingKey3, null, msg.getBytes());System.out.println("Send message : " + msg);//6. 關閉連接channel.close();connection.close();}
}
import com.rabbitmq.client.*;
import java.io.IOException;public class TopicConsumer {public static void main(String[] args) throws Exception {//1. 創建一個 ConnectionFactory 并進行設置ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setVirtualHost("/");factory.setUsername("guest");factory.setPassword("guest");factory.setAutomaticRecoveryEnabled(true);factory.setNetworkRecoveryInterval(3000);//2. 通過連接工廠來創建連接Connection connection = factory.newConnection();//3. 通過 Connection 來創建 ChannelChannel channel = connection.createChannel();//4. 聲明String exchangeName = "test_topic_exchange";String queueName = "test_topic_queue";String routingKey = "item.#";channel.exchangeDeclare(exchangeName, "topic", true, false, null);channel.queueDeclare(queueName, false, false, false, null);//一般不用代碼綁定,在管理界面手動綁定channel.queueBind(queueName, exchangeName, routingKey);//5. 創建消費者并接收消息Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body)throws IOException {String message = new String(body, "UTF-8");System.out.println(" [x] Received '" + message + "'");}};//6. 設置 Channel 消費者綁定隊列channel.basicConsume(queueName, true, consumer);}
}
Send message : this is topc msg[x] Received 'this is topc msg'
[x] Received 'this is topc msg'

Fanout 模式

不處理路由鍵,只需要簡單的將隊列綁定到交換機上發送到交換機的消息都會被轉發到與該交換機綁定的所有隊列上。
Fanout交換機轉發消息是最快的。

95566e06362d14e2aa6f704419bb141b.png
import com.rabbitmq.client.*;
import java.io.IOException;public class FanoutConsumer {public static void main(String[] args) throws Exception {//1. 創建一個 ConnectionFactory 并進行設置ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setVirtualHost("/");factory.setUsername("guest");factory.setPassword("guest");factory.setAutomaticRecoveryEnabled(true);factory.setNetworkRecoveryInterval(3000);//2. 通過連接工廠來創建連接Connection connection = factory.newConnection();//3. 通過 Connection 來創建 ChannelChannel channel = connection.createChannel();//4. 聲明String exchangeName = "test_fanout_exchange";String queueName = "test_fanout_queue";String routingKey = "item.#";channel.exchangeDeclare(exchangeName, "fanout", true, false, null);channel.queueDeclare(queueName, false, false, false, null);//一般不用代碼綁定,在管理界面手動綁定channel.queueBind(queueName, exchangeName, routingKey);//5. 創建消費者并接收消息Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body)throws IOException {String message = new String(body, "UTF-8");System.out.println(" [x] Received '" + message + "'");}};//6. 設置 Channel 消費者綁定隊列channel.basicConsume(queueName, true, consumer);}
}
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class FanoutProducer {public static void main(String[] args) throws Exception {//1. 創建一個 ConnectionFactory 并進行設置ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setVirtualHost("/");factory.setUsername("guest");factory.setPassword("guest");//2. 通過連接工廠來創建連接Connection connection = factory.newConnection();//3. 通過 Connection 來創建 ChannelChannel channel = connection.createChannel();//4. 聲明String exchangeName = "test_fanout_exchange";String routingKey1 = "item.update";String routingKey2 = "";String routingKey3 = "ookjkjjkhjhk";//任意routingkey//5. 發送String msg = "this is fanout msg";channel.basicPublish(exchangeName, routingKey1, null, msg.getBytes());channel.basicPublish(exchangeName, routingKey2, null, msg.getBytes());channel.basicPublish(exchangeName, routingKey3, null, msg.getBytes());System.out.println("Send message : " + msg);//6. 關閉連接channel.close();connection.close();}
}
Send message : this is fanout msg[x] Received 'this is fanout msg'
[x] Received 'this is fanout msg'
[x] Received 'this is fanout msg'

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454213.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454213.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454213.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

程序員成長最快的環境

除開五大或者ThoughtWorks這種要什么有什么,進去做打字也能光耀門楣的不談。如果是嫁到一個普通軟件公司,怎樣的環境才能最快的成長呢?首先基本的 公司項目管理水平是必要的;其次是穩健而不保守的公司技術選型和一班能溝通的同事。…

【BZOJ4254】Aerial Tramway 樹形DP

【BZOJ4254】Aerial Tramway 題意&#xff1a;給你一座山上n點的坐標&#xff0c;讓你在山里建m條纜車&#xff0c;要求纜車兩端的高度必須相等&#xff0c;且中間經過的點的高度都小于纜車的高度。并且不能存在一個點位于至少k條纜車的下方。求纜車的最大總長度。 n,m<200,…

C# 讀取保存App.config配置文件的完整源碼參考

最近出差在北京做一個小項目&#xff0c;項目里需要讀取配置文件的小功能&#xff0c;覺得挺有參考意義的就把代碼發上來給大家參考一下。我們選擇了直接用微軟的讀取配置文件的方法。 這個是程序的運行設計效果&#xff0c;就是把這些參數可以進行靈活設置&#xff0c;靈活保存…

TensorFlow 簡介

TensorFlow介紹 Tagline&#xff1a;An open-source software library for Machine Intelligence.Definition&#xff1a;TensorFlow TM is an open source software library fornumerical computation using data flow graphs.GitHub&#xff1a;https://github.com/tensorfl…

webbrowser設置為相應的IE版本

注冊表路徑&#xff1a; HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION 或者HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION 究竟選擇哪一個…

jmeter壓力測試_用Jmeter實現對接口的壓力測試

一、多個真實用戶對接口的壓力測試1. 獲取多個真實用戶的token的兩種方法&#xff1a;1)第一種&#xff1a;讓開發幫忙生成多個token(多個用戶賬戶生成的token)&#xff0c;導出為csv格式的文件(以下步驟均以該方法為基礎)2)第二種&#xff1a;自己設置多個用戶賬戶和密碼&…

程序員成長之路(轉)

什么時候才能成為一個專業程序員呢&#xff1f;三年還是五年工作經驗&#xff1f;其實不用的&#xff0c;你馬上就可以了&#xff0c;我沒有騙你&#xff0c;因為專業程序員與業余程序員的區別主要在于一種態度&#xff0c;如果缺乏這種態度&#xff0c;擁有十年工作經驗也還是…

嵌入式開發——PWM高級定時器

學習目標 加強掌握PWM開發流程理解定時器與通道的關系掌握多通道配置策略掌握互補PWM配置策略掌握定時器查詢方式掌握代碼抽取優化策略掌握PWM調試方式學習內容 需求 點亮8個燈,采用pwm的方式。 定時器 通道 <

解決虛擬機時間引起的奇怪問題

一直使用得好好的虛擬機最近出了一個奇怪問題在虛擬機裝好的lamp在客戶端訪問phpmyadmin的時候,使用firefox登錄沒問題,但是使用IE不行總是停留在登錄的界面,而且沒有提供任何的出錯信息,就連在apache的日志里面也看不到.注意到同樣訪問的時候,在IE上顯示的轉向的url是[url]htt…

TensorFlow 基本操作

Tensorflow基本概念 圖(Graph):圖描述了計算的過程&#xff0c;TensorFlow使用圖來表示計算任務。張量(Tensor):TensorFlow使用tensor表示數據。每個Tensor是一個類型化的多維數組。操作(op):圖中的節點被稱為op(opearation的縮寫)&#xff0c;一個op獲得/輸入0個或多個Tensor…

03_zookeeper偽集群安裝

一句話說明白&#xff1a;在1臺機器上模擬多臺機器&#xff0c;對外提供服務 在理解zookeeper集群安裝方法的基礎上&#xff0c;本文描述如何將1個機器模擬為3個節點的zookeeper集群&#xff0c;建議先參考閱讀本文的前一期 zookeeper偽集群安裝總結 在本機上通過復制的方式&am…

python合成語音_MicroPython動手做(25)——語音合成與語音識別

6、AB按鍵切換語言合成項目[mw_shl_codepython,true]#MicroPython動手做(25)——語音合成與語音識別#AB按鍵切換語言合成項目from mpython import *import networkimport timeimport ntptimefrom xunfei import *import audiomy_wifi wifi()my_wifi.connectWiFi("zh"…

專訪谷歌CEO:像對待家人一樣對待員工

導語&#xff1a;《財富》近日公布了“2012年度美國100家最適宜工作的公司”榜單&#xff0c;谷歌當選冠軍。即將于2月6日出版的美國《財富》雜志印刷版將刊登對谷歌CEO拉里佩奇(Larry Page)的專訪&#xff0c;對谷歌的工作環境進行了介紹。 以下為采訪概要&#xff1a; 問&a…

TensorFlow 分布式

一、簡介 使用單臺機器或者單個GPU/CPU來進行模型訓練&#xff0c;訓練速度會受資源的影響&#xff0c;因為畢竟單個的設備的計算能力和存儲能力具有一定的上限的&#xff0c;針對這個問題&#xff0c;TensorFlow支持分布式模型運算&#xff0c;支持多機器、多GPU、多CPU各種模…

第五周測試

---恢復內容開始--- 一 視頻知識 1 linux系統下如何區分內核態與用戶態 在內核態&#xff1a;cs:eip可以是任意的地址&#xff0c;4G的內存地址空間 在用戶態&#xff1a;cs:eip只能訪問0x00000000—0xbfffffff的地址空間 2 系統調用的三層皮&#xff1a;xyz、system_call和sys…

網頁制作小技巧:dl dt dd標簽用法

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 一般我們在做列表的時候通常只會用到ul和li,至于DL一般都很少用到&#xff0c;它也屬于列表類的標簽&#xff0c;下面說一下大概的用法&#xff1a; <dl>標記定義了一個定義列…

latex公式對齊_Word 寫公式最方便的方法

自從用上了word 2016之后&#xff0c;發現他的公式編輯器真香!真香!!他有了latex的優雅&#xff0c;又有了Mathtype的可視化效果&#xff0c;甚至更好哈&#xff0c;當編輯大量公式時也不會因為插件問題卡掉當前的努力。學起來也不復雜&#xff0c;反正是word. 強烈推薦。我們最…

路要怎么走?關于程序員成長的一點思考

程序員的我們&#xff0c;是否想過今后的路該怎么走、如何發展、技術怎樣提高?其實這也是我一直在思考的問題。下面就此問題&#xff0c;分享下我的看法。因為我閱歷有限&#xff0c;有什么說的不對的&#xff0c;大家見諒&#xff0c;千萬不要噴…… 一、程序員應該打好基礎 …

TensorFlow 常見API

數據類型轉換相關API Tensor Shape獲取以及設置相關API Tensor合并、分割相關API Error相關類API 常量類型的Tensor對象相關API 序列和隨機Tensor對象相關API Session相關API 邏輯運算符相關API 比較運算符相關API 調試相關API 圖像處理-編碼解碼相關API 圖像處理-調整大小相關…

python封裝繼承多態_淺談JavaScript的面向對象和它的封裝、繼承、多態

寫在前面既然是淺談&#xff0c;就不會從原理上深度分析&#xff0c;只是幫助我們更好地理解...面向對象與面向過程面向對象和面向過程是兩種不同的編程思想&#xff0c;剛開始接觸編程的時候&#xff0c;我們大都是從面向過程起步的&#xff0c;畢竟像我一樣&#xff0c;大家接…