rabbitmq的三個交換機及簡單使用

提前說一下,創建隊列,交換機,綁定交換機和隊列都是在生產者。消費者只負責監聽就行了,不用配其他的。

完成這個場景需要兩個服務哦。

1直連交換機-生產者的代碼。

在配置類中創建隊列,交換機,綁定交換機和隊列

@Configuration
public class DirectRabbitConfigTest {//隊列@Beanpublic Queue TestDirectQueue(){return new Queue("TestDirectQueue",true);}//交換機@BeanDirectExchange TestDirectExchange(){return new DirectExchange("TestDirectExchange",true,false);}//綁定@BeanBinding bindingDirect(){return BindingBuilder.bind(TestDirectQueue()).to(TestDirectExchange()).with("TestDirectRouting");//TestDirectRouting為路由鍵}
}

發送消息,訪問這個接口就行。

@Controller
public class test001 {@Autowiredprivate RabbitTemplate rabbitTemplate;@ResponseBody@GetMapping("/sendDirectMessage")public String sendDirectMessage() {String messageId = String.valueOf(UUID.randomUUID());String messageData = "test message, hello!";String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Map<String,Object> map=new HashMap<>();map.put("messageId",messageId);map.put("messageData",messageData);map.put("createTime",createTime);//將消息攜帶綁定鍵值:TestDirectRouting 發送到交換機TestDirectExchangerabbitTemplate.convertAndSend("TestDirectExchange", "TestDirectRouting", map);return "ok";}
}

2直連交換機-消費者的代碼

@Component
@RabbitListener(queues = "TestDirectQueue")//監聽的隊列
public class DirectReceiver {@RabbitHandlerpublic void process(Map testMessage){System.out.println("消息one:"+testMessage.toString());//這個map就是發送的消息}
}

直連交換機總結:你可以自己加幾個消費者,發送消息你會發現消息被輪詢了。

訪問@GetMapping("/sendDirectMessage")消息就發出并被接收。

3topic交換機-生產者的代碼

注意:需要自己去控制臺添加firstQueue和secondQueue隊列,不然消費者啟動不起來。原因未知,在直連交換機的時候機器自己創建隊列了,topic不知道為啥不行。

@Configuration
public class TopicRabbitConfigTest {//綁定鍵public final static String man = "topic.man";public final static String woman = "topic.woman";@Beanpublic Queue firstQueue() {//return new Queue(TopicRabbitConfigTest.man);return new Queue("firstQueue");}@Beanpublic Queue secondQueue() {//return new Queue(TopicRabbitConfigTest.woman);return new Queue("secondQueue");}@BeanTopicExchange exchange() {return new TopicExchange("topicExchange");}//將firstQueue和topicExchange綁定,而且綁定的鍵值為topic.man//這樣只要是消息攜帶的路由鍵是topic.man,才會分發到該隊列@BeanBinding bindingExchangeMessage() {return BindingBuilder.bind(firstQueue()).to(exchange()).with(man);}//將secondQueue和topicExchange綁定,而且綁定的鍵值為用上通配路由鍵規則topic.#// 這樣只要是消息攜帶的路由鍵是以topic.開頭,都會分發到該隊列@BeanBinding bindingExchangeMessage2() {return BindingBuilder.bind(secondQueue()).to(exchange()).with("topic.#");}}

發送消息,訪問這兩個接口就行。

@Controller
public class TopicTest002 {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMapping("/sendTopicMessage1")public String sendTopicMessage1() {String messageId = String.valueOf(UUID.randomUUID());String messageData = "message: M A N ";String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Map<String, Object> manMap = new HashMap<>();manMap.put("messageId", messageId);manMap.put("messageData", messageData);manMap.put("createTime", createTime);rabbitTemplate.convertAndSend("topicExchange", "topic.man", manMap);return "ok";}@GetMapping("/sendTopicMessage2")public String sendTopicMessage2() {String messageId = String.valueOf(UUID.randomUUID());String messageData = "message: woman is all ";String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Map<String, Object> womanMap = new HashMap<>();womanMap.put("messageId", messageId);womanMap.put("messageData", messageData);womanMap.put("createTime", createTime);rabbitTemplate.convertAndSend("topicExchange", "topic.woman", womanMap);return "ok";}
}

4topic交換機-消費者的代碼

需要監聽兩個隊列

@Component
@RabbitListener(queues = "firstQueue")//監聽的隊列
public class TopicManReceiver {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("TopicManReceiver消費者收到消息  : " + testMessage.toString());}}
@Component
@RabbitListener(queues = "secondQueue")//監聽的隊列
public class TopicWoManReceiver {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("TopicTotalReceiver消費者收到消息  : " + testMessage.toString());}}

先訪問@GetMapping("/sendTopicMessage1")接口,再訪@GetMapping("/sendTopicMessage2")接口,結果如下:

總結:綁定和發送的時候都要設置路由鍵。

5fanout交換機-生產者

注意:這種交換機也需要自己去控制臺創建隊列。fanout交換機不需要設置路由key

@Configuration
public class FanoutRabbitConfigTest {/***  創建三個隊列 :fanout.A   fanout.B  fanout.C*  將三個隊列都綁定在交換機 fanoutExchange 上*  因為是扇型交換機, 路由鍵無需配置,配置也不起作用*/@Beanpublic Queue queueA() {return new Queue("fanout.A");}@Beanpublic Queue queueB() {return new Queue("fanout.B");}@Beanpublic Queue queueC() {return new Queue("fanout.C");}@BeanFanoutExchange fanoutExchange() {return new FanoutExchange("fanoutExchange");}@BeanBinding bindingExchangeA() {return BindingBuilder.bind(queueA()).to(fanoutExchange());}@BeanBinding bindingExchangeB() {return BindingBuilder.bind(queueB()).to(fanoutExchange());}@BeanBinding bindingExchangeC() {return BindingBuilder.bind(queueC()).to(fanoutExchange());}}

發送消息,訪問這個接口就行。

@Controller
public class FanoutTest003 {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMapping("/sendFanoutMessage")public String sendFanoutMessage() {String messageId = String.valueOf(UUID.randomUUID());String messageData = "message: testFanoutMessage ";String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Map<String, Object> map = new HashMap<>();map.put("messageId", messageId);map.put("messageData", messageData);map.put("createTime", createTime);rabbitTemplate.convertAndSend("fanoutExchange", null, map);return "ok";}}

6fanout交換機-消費者

@Component
@RabbitListener(queues = "fanout.A")//監聽的隊列
public class FanoutA {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("FanoutReceiverA消費者收到消息  : " +testMessage.toString());}
}
@Component
@RabbitListener(queues = "fanout.B")//監聽的隊列
public class FanoutB {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("FanoutReceiverB消費者收到消息  : " +testMessage.toString());}}
@Component
@RabbitListener(queues = "fanout.C")//監聽的隊列
public class FanoutC {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("FanoutReceiverC消費者收到消息  : " +testMessage.toString());}}

總結:三個消費者都收到了消息

重點:直連交換機不管綁定多少個隊列,消息會到達所有隊列,然后去消費者方進行輪詢。

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

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

相關文章

uniapp 使用 pinia 狀態持久化

1.創建文件 stores -index.js -global.js2.對應文件內容 index.js 安裝插件 npm i pinia-plugin-persistedstate import { createPinia } from pinia; import persist from pinia-plugin-persistedstate; const pinia createPinia(); pinia.use(persist); export default pi…

代碼隨想錄算法訓練營第3天(鏈表1)| 203.移除鏈表元素 707.設計鏈表 206.反轉鏈表

一、203.移除鏈表元素 題目&#xff1a;203. 移除鏈表元素 - 力扣&#xff08;LeetCode&#xff09; 視頻&#xff1a;手把手帶你學會操作鏈表 | LeetCode&#xff1a;203.移除鏈表元素_嗶哩嗶哩_bilibili 講解&#xff1a;代碼隨想錄 注意&#xff1a; 針對頭結點和非頭結點的…

NetMQ里Push-Pull模式,消息隔一收一問題小記

問題&#xff1a; 本機環境下&#xff0c;在push端向pull端發送消息的過程中&#xff0c;發現同一個進程里的pusher和puller代碼&#xff0c;可以準確地完成收發&#xff1b; 然而&#xff0c;將代碼放在兩個進程里&#xff0c;將pusher發送的消息從1計數&#xff0c;puller端竟…

CES Asia 2025科技盛宴,AI智能體成焦點

2025第七屆亞洲消費電子技術展&#xff08;CES Asia賽逸展&#xff09;將在北京拉開帷幕&#xff0c;AI智能體有望成為展會的核心亮點。 深圳市人工智能行業協會發文表示全力支持CES Asia 2025&#xff08;賽逸展&#xff09;&#xff0c;稱其為人工智能領域的創新發展提供了強…

matlab編寫分段Hermite插值多項式

文章目錄 原理使用分段Hermite插值多項式原因公式第一類的兩個插值積函數第二類的兩個插值積函數 例題法一法二 代碼分段 Hermite 插值的思路&#xff1a;分段 Hermite 插值多項式的構造&#xff1a;MATLAB 實現代碼&#xff1a;結果如圖&#xff1a;注歸一化變量的作用&#x…

Cline(原Claude Dev)開源的IDE AI插件,如何搭配OpenRouter實現cursor功能,Cline怎么使用

Cline&#xff08;原Claude Dev&#xff09;是一個開源的IDE AI插件&#xff0c;可以使用你的命令行界面和編輯器的人工智能助手。 你可以直接在VS Code編輯器進行安裝。如果你使用過Cursor AI IDE的話&#xff0c;可以嘗試最新發布的Cline3.1版本。 在OpenRouter上&#xff0…

計科高可用服務器架構實訓(防火墻、雙機熱備,VRRP、MSTP、DHCP、OSPF)

一、項目介紹 需求分析&#xff1a; &#xff08;1&#xff09;總部和分部要求網絡拓撲簡單&#xff0c;方便維護&#xff0c;網絡有擴展和冗余性&#xff1b; &#xff08;2&#xff09;總部分財務部&#xff0c;人事部&#xff0c;工程部&#xff0c;技術部&#xff0c;提供…

企業級PHP異步RabbitMQ協程版客戶端 2.0 正式發布

概述 workerman/rabbitmq 是一個異步RabbitMQ客戶端&#xff0c;使用AMQP協議。 RabbitMQ是一個基于AMQP&#xff08;高級消息隊列協議&#xff09;實現的開源消息組件&#xff0c;它主要用于在分布式系統中存儲和轉發消息。RabbitMQ由高性能、高可用以及高擴展性出名的Erlan…

AsyncOperation.allowSceneActivation導致異步加載卡死

先看這段代碼&#xff0c;有個詭異的問題&#xff0c;不確定是不是bug public class Test : MonoBehaviour {void Start(){StartCoroutine(LoadScene(Ego.LoadingLevel));}IEnumerator LoadScene(string sceneName){LoadingUI.UpdateProgress(0.9f);yield return new WaitForS…

C#使用MVC框架創建WebApi服務接口

第一步,使用VS2019新建MVC-Web API應用程序 創建BridgeApi 第二步,運行將生成默認的示例網頁,網頁Url為 https://localhost:44361/home/index 右鍵 項目 添加 WebAPI控制器類 添加 我們可以看到App_Start目錄下 有三個文件: BundleConfig.cs代表 捆綁文件的引用 有腳本文件…

wordpress 房產網站篩選功能

自定義分類法創建 add_action( init, ashu_post_type ); function ashu_post_type() {register_taxonomy(province,post,array(label => 省,rewrite => array( slug => province ),hierarchical => true));register_taxonomy(city,post,array(label => 市,rewr…

hive遷移后修復分區慢,怎么辦?

我有1個30TB的分區表&#xff0c;客戶給的帶寬只有600MB&#xff0c;按照150%的耗時來算&#xff0c;大概要遷移17小時。 使用hive自帶的修復分區命令&#xff08;一般修復分區比遷移時間長一點&#xff09;&#xff0c;可能要花24小時。于是打算用前面黃大佬的牛B方案。 Hive增…

慧集通(DataLinkX)iPaaS集成平臺-業務建模之業務對象(一)

通過左側導航菜單〖業務建模〗→〖業務對象〗&#xff0c;進入該界面&#xff1b;在該界面可以查看到系統中已存在的業務對象&#xff1b; 1.新建業務對象 在DatalinkX中進入【業務建模】的【業務對象】頁面&#xff0c;點擊【新建】按鈕進入新建頁面&#xff1b; 新建頁面左側…

Linux系統之hostname相關命令基本使用

Linux系統之hostname相關命令基本使用 一、檢查本地系統版本二、hostname命令的幫助說明中文幫助說明 三、hostname命令的基本使用1. 查看計算機名2. 查看本機上所有IP地址3. 查看主機FQDN4. 查看短主機名 四、hostnamectl命令的使用1. 查看主機詳細信息2. 設置主機名3. hostna…

DC系列靶場滲透--DC-3

目錄 環境搭建 開始滲透 掃存活 掃端口 掃服務 查看80端口 嘗試在80端口中的登陸頁面尋找sql注入失敗 掃目錄 進入/htaccess.txt目錄看一下 我們嘗試找一下Joomla3.7.0版本的漏洞 我們嘗試利用該漏洞 查數據庫名 查表名 查列名 查數據 找到密碼的可能的編碼方式…

js代理模式

允許在不改變原始對象的情況下&#xff0c;通過代理對象來訪問原始對象。代理對象可以在訪問原始對象之前或之后&#xff0c;添加一些額外的邏輯或功能。 科學上網過程 一般情況下,在訪問國外的網站,會顯示無法訪問 因為在dns解析過程,這些ip被禁止解析,所以顯示無法訪問 引…

uniapp 之 uni-forms校驗提示【提交的字段[‘xxx‘]在數據庫中并不存在】解決方案

目錄 場景問題代碼結果問題剖析解決方案 場景 uni-forms官方組件地址 使用uniapp官方提供的組件&#xff0c;某個表單需求&#xff0c;單位性質字段如果是高校&#xff0c;那么工作單位則是高校的下拉選擇格式&#xff0c;單位性質如果是其他的類型&#xff0c;工作單位則是手動…

深度學習知識點:RNN

文章目錄 1.簡單介紹2.網絡結構3.應對梯度消失 1.簡單介紹 循環神經網絡&#xff08;RNN&#xff0c;Recurrent Neural Network&#xff09;是一類用于處理序列數據的神經網絡。與傳統網絡相比&#xff0c;變化不是特別大&#xff0c;不如CNN的變化那么大。 為什么要有循環神經…

(leetcode算法題)287. 尋找重復數(經典題目,二分解法)

如果一個題目限定了數據范圍是[1, n]內的整數&#xff0c;那么這個題目可以思考的就是 nums[i]和 i 的關系&#xff0c;769. 最多能完成排序的塊 這個題就使用到了子數組中最大值和 連續[0, n - 1]的關系 而對于本題來說&#xff0c;也可以思考[1, n] 和 nums[i] 的關系&…

獲得PostgreSQL中級認證后,可以從事哪些工作崗位?

獲得 PostgreSQL 中級認證后&#xff0c;可以獲得的崗位 數據庫管理類 數據庫管理員&#xff08;DBA&#xff09;&#xff1a;負責 PostgreSQL 數據庫的日常維護、監控、備份與恢復、性能優化、安全管理等工作。確保數據庫的穩定運行和數據的安全性、完整性&#xff0c;及時處理…