rabbitMQ消息轉換器

消息轉換器

Spring的消息發送代碼接收的消息體是一個Object:

而在數據傳輸時,它會把你發送的消息序列化為字節發送給MQ,接收消息的時候,還會把字節反序列化為Java對象。

只不過,默認情況下Spring采用的序列化方式是JDK序列化。眾所周知,JDK序列化存在下列問題:

  • 數據體積過大
  • 有安全漏洞
  • 可讀性差

我們來測試一下。

測試默認轉換器

創建測試隊列

我們在consumer服務中聲明一個配置類,MessageConfig,里面編寫方法創建隊列。

@Configuration
public class MessageConfig {@Beanpublic Queue objectQueue(){return new Queue("object.queue");}
}

重啟consumer服務,看看rabbit控制臺。

發送map消息

在consumer服務中,新增ObjectQueueTest類,發送消息。

@SpringBootTest
public class ObjectQueueTest {@Autowiredprivate RabbitTemplate rabbitTemplate;@Testpublic void testSendObjectQueue(){// 1 隊列String queueName = "object.queue";// 2 消息Map<String,Object> map = new HashMap<>();map.put("name","sde");map.put("age",18);// 3 發送消息rabbitTemplate.convertAndSend(queueName,map);}
}

看看控制臺是否有消息

查看消息

可以看到消息格式非常不友好。

配置JSON轉換器

添加依賴

顯然,JDK序列化方式并不合適。我們希望消息體的體積更小、可讀性更高,因此可以使用JSON方式來做序列化和反序列化。

在publisher和consumer兩個服務中都引入依賴

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>

注意:如果項目中引入了spring-boot-starter-web依賴,則無需再次引入Jackson依賴。

配置消息轉換器

配置消息轉換器,在publisher和consumer兩個服務的啟動類中添加一個Bean即可。

在PublisherApplication啟動類中添加

@SpringBootApplication
public class PublisherApplication {public static void main(String[] args) {SpringApplication.run(PublisherApplication.class);}@Beanpublic MessageConverter messageConverter(){// 1 定義消息轉換器Jackson2JsonMessageConverter jjmc = new Jackson2JsonMessageConverter();//2、配置每條消息自動創建id;用于識別不同消息,也可以在頁面中基于id判斷是否是重復消息jjmc.setCreateMessageIds(true);return jjmc;}}

在ConsumerApplication 啟動類添加如下

@SpringBootApplication
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}@Beanpublic MessageConverter messageConverter(){// 1 定義消息轉換器Jackson2JsonMessageConverter jjmc = new Jackson2JsonMessageConverter();//2、配置每條消息自動創建id;用于識別不同消息,也可以在頁面中基于id判斷是否是重復消息jjmc.setCreateMessageIds(true);return jjmc;}}

測試

① 在rabbitMQ的控制臺中刪除 object.queue 隊列中的消息;重新啟動 consumer

② 執行 com.sde.publisher.ObjectQueueTest類里面的方法,發送消息。

③ 在rabbitMQ的控制臺中;查看消息

刪除隊列里面的消息

重啟了 consumer服務

再次發送了一條消息

控制臺查看消息

消費者接收Object

我們在consumer服務中定義一個新的消費者,publisher是用Map發送,那么消費者也一定要用Map接收。

新創建 ObjectQueueListener 類,編寫代碼接收消息。

@Slf4j
@Component
public class ObjectQueueListener {/*** 監聽 object.queue 隊列中的消息。*/@RabbitListener(queues = "object.queue")public void listenObjectQueue(Map<String,Object> map){System.out.println("【消費者】監聽到 object.queue 隊列的消息:"+map);}
}

控制臺

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

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

相關文章

Java 如何覆蓋第三方 jar 包中的類

目錄 一、需求描述二、示例描述三、操作步驟四、驗證結果五、實現原理 背景&#xff1a; 在我們日常的開發中&#xff0c;經常需要使用第三方的 jar 包&#xff0c;有時候我們會發現第三方的 jar 包中的某一個類有問題&#xff0c;或者我們需要定制化修改其中的邏輯&#xff0c…

CS 與 BS 架構的差異

在數字化的今天&#xff0c;選擇軟件架構模式對系統的性能、維護、安全和成本都有很大影響。BS架構和CS架構是最常見的兩種模式&#xff0c;了解它們的區別和特點對開發人員和企業決策者都很重要。 CS架構最早出現&#xff0c;當時用戶直接從主機獲取數據。隨著客戶端和服務端…

HTML之table表格學習

HTML table使用 thead、tbody、tfoot均可省略&#xff1b; 瀏覽器解析的時候會自動套上tbody tr 行 td 列 th 標題列屬性 colspan 列占用數 rowspan 行占用數 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">…

常用抓包工具tcpdump、Fiddler、Charles、Wireshark 和 Sniffmaster 下載地址

抓包大師官網下載地址 Sniff Master Download - Free TCP and HTTPS Proxy Sniffing Tool, Supports IOS Sniffing Fiddler classic官網下載地址 Download Fiddler Web Debugging Tool for Free by Telerik Fiddler Everywhere官網下載地址 The Ultimate Web Debugging Tool …

【PostgreSQL內核學習 —— (WindowAgg(二))】

WindowAgg WindowAggState 結構體窗口聚合行為ExecInitWindowAgg 函數ExecWindowAgg 函數代碼邏輯解釋&#xff1a;計算窗口偏移量代碼邏輯詳細解釋&#xff1a; 代碼邏輯解釋&#xff1a;窗口聚合分區初始化與行推進邏輯代碼邏輯詳細解釋&#xff1a; 代碼邏輯解釋&#xff1a…

區塊鏈項目孵化與包裝設計:從概念到市場的全流程指南

區塊鏈技術的快速發展催生了大量創新項目&#xff0c;但如何將一個區塊鏈項目從概念孵化成市場認可的產品&#xff0c;是許多團隊面臨的挑戰。本文將從孵化策略、包裝設計和市場落地三個維度&#xff0c;為你解析區塊鏈項目成功的關鍵步驟。 一、區塊鏈項目孵化的核心要素 明確…

【React】受控組件和非受控組件

目錄 受控組件非受控組件基于ref獲取DOM元素1、在標簽中使用2、在組件中使用 受控組件 表單元素的狀態&#xff08;值&#xff09;由 React 組件的 state 完全控制。組件的 state 保存了表單元素的值&#xff0c;并且每次用戶輸入時&#xff0c;React 通過事件處理程序來更新 …

C#開發的進銷存管理系統軟件

#### 介紹 進銷存管理系統實現的功能及用途 含模塊銷售管理、采購管理、存貨管理、庫存管理、賬款管理、用戶管理、職員管理七個部分 進銷存管理系統實現以下功能&#xff1a; 1. 庫存管理 2. 應付賬款和應收賬款的統計 3. 對訂單未結數量和采購單未結數量的統計 4. 權限的管理…

高性能 AI 處理器親和性調度算法實現

目錄 題目描述解題思路分析C 語言實現 生成組合的函數主程序實現C 語言代碼使用示例Python 實現 生成組合的函數主程序實現Python 代碼使用示例總結與展望題目描述 某公司研發的高性能 AI 處理器,每臺物理設備 a 包含 8 顆 AI 處理器,編號為 0 - 7。其中,編號 0 - 3 的處理…

快手ip屬地是定位嗎?怎么改

在當今數字化時代&#xff0c;隨著網絡平臺的不斷發展&#xff0c;用戶隱私和數據安全成為了公眾關注的焦點。各大社交媒體平臺紛紛推出的“IP屬地”功能&#xff0c;無疑為網絡環境增添了一抹新的色彩。其中&#xff0c;快手的IP屬地顯示功能尤為引人注目。那么&#xff0c;快…

Git 常用基礎命令詳解:init、add、commit

一、引言 在軟件開發的世界里&#xff0c;版本控制是一項至關重要的技術&#xff0c;它就像是一個時光機器&#xff0c;讓開發者能夠追蹤代碼的每一次變化&#xff0c;輕松回溯到任意歷史版本&#xff0c;同時也為多人協作開發提供了強大的支持。而 Git&#xff0c;作為目前最…

1-kafka服務端之延時操作前傳--時間輪

文章目錄 背景時間輪層級時間輪時間輪降級kafka中的時間輪kafka如何進行時間輪運行 背景 Kafka中存在大量的延時操作&#xff0c;比如延時生產、延時拉取和延時刪除等。Kafka并沒有使用JDK自帶的Timer或DelayQueue來實現延時的功能&#xff0c;而是基于時間輪的概念自定義實現…

從零開始:OpenCV 圖像處理快速入門教程

文章大綱 第1章 OpenCV 概述 1.1 OpenCV的模塊與功能  1.2 OpenCV的發展 1.3 OpenCV的應用 第2章 基本數據類型 2.1 cv::Vec類 2.2 cv&#xff1a;&#xff1a;Point類 2.3 cv&#xff1a;&#xff1a;Rng類 2.4 cv&#xff1a;&#xff1a;Size類 2.5 cv&#xff1a;&…

網絡工程師 (22)網絡協議

前言 網絡協議是計算機網絡中進行數據交換而建立的規則、標準或約定的集合&#xff0c;它規定了通信時信息必須采用的格式和這些格式的意義。 一、基本要素 語法&#xff1a;規定信息格式&#xff0c;包括數據及控制信息的格式、編碼及信號電平等。這是協議的基礎&#xff0c;確…

vue如何解決跨域

文章目錄 vue如何解決跨域1. 什么是跨域2. 如何解決2.1 CROS&#xff08;Cross-Origin Resource Sharing&#xff0c;跨域資源共享&#xff09;2.2 Proxy2.2.1 使用webpack proxy2.2.2 服務端代理轉發2.2.3 通過nginx實現代理 vue如何解決跨域 1. 什么是跨域 跨域本質是瀏覽器…

算法與數據結構(括號匹配問題)

思路 從題干可以看出&#xff0c;只要給出的括號對應關系正確&#xff0c;那么就可以返回true,否則返回false。這個題可以使用棧來解決 解題過程 首先從第一個字符開始遍歷&#xff0c;如果是括號的左邊&#xff08;‘&#xff08;‘&#xff0c;’[‘&#xff0c;’}‘&…

在linux 中搭建deepseek 做微調,硬件配置要求說明

搭建 可參考 使用deepseek-CSDN博客 官方網站&#xff1a;DeepSeek DeepSeek 是一個基于深度學習的開源項目&#xff0c;旨在通過深度學習技術來提升搜索引擎的準確性和效率。如果你想在 Linux 系統上搭建 DeepSeek&#xff0c;你可以遵循以下步驟。這里我將提供一個基本的指…

mounted鉤子函數里如何操作子組件的DOM?

在 Vue 的 mounted 鉤子函數中,操作子組件的 DOM 可以通過幾種方式實現,具體取決于對子組件的訪問方式。以下是一些常用的方法: 一、使用 ref 引用 定義 ref在父組件中,給子組件添加一個 ref 屬性,這樣就可以在父組件中通過 this.$refs 訪問到子組件的實例。 父組件示例…

vue2-為啥data屬性是一個函數而不是對象

vue2-為啥data屬性是一個函數而不是對象 1. data在vue實例和組件中的表現差異 vue實例的時候&#xff0c;data既可以是一個對象也可以是一個函數 new Vue({data:{//對象name:tom},data(){//函數return{name:tom}} })而在組件中定義data&#xff0c;只能是函數&#xff0c;如…

利用deepseek參與軟件測試 基本架構如何 又該在什么環節接入deepseek

利用DeepSeek參與軟件測試&#xff0c;可以考慮以下基本架構和接入環節&#xff1a; ### 基本架構 - **數據層** - **測試數據存儲**&#xff1a;用于存放各種測試數據&#xff0c;包括正常輸入數據、邊界值數據、異常數據等&#xff0c;這些數據可以作為DeepSeek的輸入&…