用idea進行數據同步

  1. 聲明對列和交換機

    你需要先在yaml文件當中進行rabbitmq的相關配置

rabbitmq:host:192.168.150.101        //消息件的地址port:5672                   //端口數據username:itcast             //用戶名password:123321             //密碼virtual-host:/              //虛擬機主機名

聲明隊列交換機,創建新的工具類,定義不同功能的交換機

public class MqConstants {/*** 交換機*/public final static String HOTEL_EXCHANGE = "hotel.topic";/*** 監聽新增和修改的隊列*/public final static String HOTEL_INSERT_QUEUE = "hotel.insert.queue";/*** 監聽刪除的隊列*/public final static String HOTEL_DELETE_QUEUE = "hotel.delete.queue";/*** 新增或修改的RoutingKey*/public final static String HOTEL_INSERT_KEY = "hotel.insert";/*** 刪除的RoutingKey*/public final static String HOTEL_DELETE_KEY = "hotel.delete";
}
  • 生產者發送消息時,指定交換機為 HOTEL_EXCHANGE 、路由鍵為 HOTEL_INSERT_KEY 等。

  • 消費者聲明隊列并綁定到 HOTEL_EXCHANGE 交換機,通過對應的路由鍵(HOTEL_INSERT_KEY / HOTEL_DELETE_KEY )來訂閱特定業務(新增修改 / 刪除 )的消息 。

定義隊列交換機的對象和綁定關系:

  1. 基于@Bean的方式

    這種方式適合在配置類當中集中管理隊列,交換機,綁定關系的 Bean 定義,結構清晰,便于統一維護。

    import org.springframework.amqp.core.*;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    ?
    // 配置類注解,讓 Spring 掃描并加載這些 Bean 定義
    @Configuration
    public class RabbitMqConfig {
    ?// 1. 定義交換機(對應 MqConstants 里的交換機)@Beanpublic TopicExchange hotelExchange() {// 創建一個 Topic 類型的交換機,名稱用 MqConstants 里的return new TopicExchange(MqConstants.HOTEL_EXCHANGE);}
    ?// 2. 定義“新增和修改”隊列@Beanpublic Queue hotelInsertQueue() {return new Queue(MqConstants.HOTEL_INSERT_QUEUE);}
    ?// 3. 定義“刪除”隊列@Beanpublic Queue hotelDeleteQueue() {return new Queue(MqConstants.HOTEL_DELETE_QUEUE);}
    ?// 4. 綁定“新增和修改”隊列到交換機(設置路由鍵)@Beanpublic Binding bindHotelInsertQueue(TopicExchange hotelExchange, Queue hotelInsertQueue) {// 用 MqConstants 里的新增路由鍵,將隊列綁定到交換機return BindingBuilder.bind(hotelInsertQueue).to(hotelExchange).with(MqConstants.HOTEL_INSERT_KEY);}
    ?// 5. 綁定“刪除”隊列到交換機(設置路由鍵)@Beanpublic Binding bindHotelDeleteQueue(TopicExchange hotelExchange, Queue hotelDeleteQueue) {// 用 MqConstants 里的刪除路由鍵,將隊列綁定到交換機return BindingBuilder.bind(hotelDeleteQueue).to(hotelExchange).with(MqConstants.HOTEL_DELETE_KEY);}
    }
    • 交換機類型:這里用了 TopicExchange(主題交換機 ),和 MqConstantshotel.topic 對應,也可以根據實際需求換成 DirectExchange(直連 )、FanoutExchange(扇形 / 廣播 )等。

    • Bean 依賴注入:綁定方法(如 bindHotelInsertQueue )的參數,會由 Spring 自動注入對應的交換機、隊列 Bean,要保證方法參數名或類型能匹配上容器里的 Bean 。

    • 路由鍵作用:通過 with 方法指定路由鍵,這樣交換機就會根據路由鍵,把不同業務(新增修改、刪除 )的消息路由到對應的隊列

    1. 基于注解的方式

      這種方式更靈活,通常在消費者監聽方法上直接聲明隊列、交換機和綁定關系,適合快速開發簡單場景,或者臨時新增隊列綁定的情況。

      import org.springframework.amqp.rabbit.annotation.Exchange;
      import org.springframework.amqp.rabbit.annotation.Queue;
      import org.springframework.amqp.rabbit.annotation.QueueBinding;
      import org.springframework.amqp.rabbit.annotation.RabbitListener;
      import org.springframework.stereotype.Component;
      ?
      @Component // 讓 Spring 掃描到這個組件
      public class HotelMqListener {
      ?// 監聽“新增和修改”隊列,同時聲明隊列、交換機、綁定關系@RabbitListener(bindings = @QueueBinding(value = @Queue(name = MqConstants.HOTEL_INSERT_QUEUE, durable = "true"), // 聲明隊列,durable = true 表示持久化exchange = @Exchange(name = MqConstants.HOTEL_EXCHANGE, type = "topic"), // 聲明交換機,類型 topickey = MqConstants.HOTEL_INSERT_KEY // 路由鍵))public void handleHotelInsert(String message) {// 這里寫接收到“新增或修改”消息后的業務邏輯,比如更新 Elasticsearch 酒店數據System.out.println("收到酒店新增/修改消息:" + message);}
      ?// 監聽“刪除”隊列,同時聲明隊列、交換機、綁定關系@RabbitListener(bindings = @QueueBinding(value = @Queue(name = MqConstants.HOTEL_DELETE_QUEUE, durable = "true"),exchange = @Exchange(name = MqConstants.HOTEL_EXCHANGE, type = "topic"),key = MqConstants.HOTEL_DELETE_KEY))public void handleHotelDelete(String message) {// 這里寫接收到“刪除”消息后的業務邏輯,比如從 Elasticsearch 移除酒店數據System.out.println("收到酒店刪除消息:" + message);}
      }
      • 注解參數說明:

        • @Queue:聲明隊列,name 指定隊列名稱,durable 設置是否持久化(建議生產環境設為 true ,防止 RabbitMQ 重啟隊列丟失 )。

        • @Exchange:聲明交換機,name 是交換機名稱,type 指定類型(如 topicdirectfanout 等 )。

        • @QueueBinding:把隊列、交換機、路由鍵綁定起來,讓交換機知道如何把消息路由到這個隊列。

      • 消費者方法handleHotelInserthandleHotelDelete 方法就是實際處理消息的邏輯,當對應的隊列有消息進來時,方法會被觸發執行。

      以下為Rabbitmq的消息發送的代碼,當我們在進行增刪改等操作的時候,我們只需在其方法內進行消息的發送

       // 新增酒店@PostMappingpublic void saveHotel(@RequestBody Hotel hotel) {hotelService.save(hotel);// 發送新增消息,用新增路由鍵rabbitTemplate.convertAndSend(MqConstants.HOTEL_EXCHANGE, MqConstants.HOTEL_INSERT_KEY, hotel.getId());}
      ?// 修改酒店@PutMappingpublic void updateById(@RequestBody Hotel hotel) {if (Objects.isNull(hotel.getId())) {throw new InvalidParameterException("id不能為空");}hotelService.updateById(hotel);// 發送修改消息,用修改路由鍵rabbitTemplate.convertAndSend(MqConstants.HOTEL_EXCHANGE, MqConstants.HOTEL_UPDATE_KEY, hotel.getId());}
      ?// 刪除酒店@DeleteMapping("/{id}")public void deleteById(@PathVariable("id") Long id) {hotelService.removeById(id);// 發送刪除消息,用刪除路由鍵rabbitTemplate.convertAndSend(MqConstants.HOTEL_EXCHANGE, MqConstants.HOTEL_DELETE_KEY, id);}
      }

      當我們進行消息的發送個時候,我們所需要的參數有。交換機的名字。交換機的路由。需要發送的消息。

消息發送之后,再進行消息的監聽。

消息的監聽的時候,需要先進行接口的定義,分別定義新增修改和刪除的業務接口,可以使用RabbitListener注解進行消息的監聽。

 /*** 監聽酒店新增或修改隊列:從數據庫查詢最新數據,同步到 Elasticsearch* */@RabbitListener(queues = MqConstants.HOTEL_INSERT_QUEUE)@Transactionalpublic void listenHotelInsertOrUpdate(Long id) {hotelRepository.save(hotel);}
?/*** 監聽酒店刪除隊列:從 Elasticsearch 刪除對應酒店數據* @param id 酒店ID*/@RabbitListener(queues = MqConstants.HOTEL_DELETE_QUEUE)@Transactionalpublic void listenHotelDelete(Long id) {// 從 Elasticsearch 刪除酒店hotelRepository.deleteById(id);System.out.println("酒店刪除,同步 Elasticsearch 成功,酒店ID:" + id);}
定義過接口之后,我們就可以進行方法的實現@Overridepublic void deleteById(Long id) {// 1. 準備Request:創建刪除請求,指定索引和文檔IDDeleteRequest request = new DeleteRequest(INDEX_NAME, id.toString());
?// 2. 準備發送請求:執行刪除操作(這里直接執行,也可做一些請求參數的額外設置,比如超時等)try {DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);if (response.getResult() != null) {System.out.println("Elasticsearch 文檔刪除成功,文檔ID:" + id + ",結果:" + response.getResult());} else {System.err.println("Elasticsearch 文檔刪除失敗,文檔ID:" + id);}} catch (Exception e) {e.printStackTrace();System.err.println("刪除 Elasticsearch 文檔時發生異常,文檔ID:" + id + ",異常信息:" + e.getMessage());}}
?@Overridepublic void insertById(Long id) {// 0. 根據id查詢酒店數據:從數據庫查詢Hotel hotel = hotelDbService.getHotelById(id); // 需實現該方法,返回 Hotel 實體if (hotel == null) {System.err.println("根據ID查詢酒店數據為空,ID:" + id);return;}
?// 1. 準備Request:創建索引請求,指定索引IndexRequest request = new IndexRequest(INDEX_NAME);request.id(id.toString()); // 設置文檔ID,與酒店ID對應
?try {// 將 Hotel 對象轉為 JSON 字符串,作為文檔內容String hotelJson = objectMapper.writeValueAsString(hotel);request.source(hotelJson, XContentType.JSON);
?// 2. 準備DSL:這里 DSL 已經通過 request.source 等方式設置好了,// ?  若是復雜場景,可繼續添加路由、超時等參數,比如 request.routing("...")
?// 3. 發送請求:執行索引(新增/更新)操作IndexResponse response = client.index(request, RequestOptions.DEFAULT);System.out.println("Elasticsearch 文檔插入/更新成功,文檔ID:" + id + ",結果:" + response.getResult());} catch (Exception e) {e.printStackTrace();System.err.println("插入/更新 Elasticsearch 文檔時發生異常,文檔ID:" + id + ",異常信息:" + e.getMessage());}}

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

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

相關文章

實戰:Java web應用性能分析之【異步日志:性能優化的金鑰匙】

概敘 實戰:Java web應用性能分析之【Arthas性能分析trace監控后端性能】-CSDN博客 在優化方面,可以采取以下步驟: ?性能分析工具?:使用Arthas或Async Profiler進行實時診斷,定位耗時的方法調用。這可以幫助精確找…

Puppeteer API

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】

【機器學習】Teacher-Student框架

Teacher-Student Setup是一個經典的機器學習框架,包含兩個核心角色: 教師模型 (Teacher Model): 通常是一個更大、更強、已經訓練好(或正在訓練)的模型。它對問題有很好的理解,性能優秀。它的作用是為學生提…

華為云Flexus+DeepSeek征文|體驗華為云ModelArts快速搭建Dify-LLM應用開發平臺并創建聯網大模型

華為云FlexusDeepSeek征文|體驗華為云ModelArts快速搭建Dify-LLM應用開發平臺并創建聯網大模型 什么是華為云ModelArts 華為云ModelArts ModelArts是華為云提供的全流程AI開發平臺,覆蓋從數據準備到模型部署的全生命周期管理,幫助企業和開發…

Web API 路徑設計哪家強

本文檔主要比較一下各家API的URL路徑設計,通過學習各家API的URL路徑設計,加深對 REST API 的理解,幫助我們設計出更符合 REST 風格的 API。 Google API 文檔地址:https://developers.google.com/apis-explorer/#p/ YouTube Dat…

微信小程序中的計算屬性庫-miniprogram-computed

miniprogram-computed 是一個用于微信小程序的擴展庫,它提供了計算屬性(computed)和監聽器(watch)的功能,類似于 Vue.js 中的計算屬性和監聽器。以下是使用 miniprogram-computed 的詳細步驟: …

【CSS-7】深入解析CSS偽類:從基礎到高級應用

CSS偽類是前端開發中不可或缺的強大工具,它們允許我們根據文檔樹之外的信息或簡單選擇器無法表達的狀態來樣式化元素。本文將全面探討CSS偽類的各種類型、使用場景和最佳實踐。 1. 偽類基礎概念 1.1 什么是偽類? 偽類(Pseudo-class&#x…

藍橋杯國賽訓練 day4

目錄 再創新高 藍橋大使 表演賽 次數差 再創新高 import java.math.*; import java.util.*;public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {int t 1; // tsc.nextInt();for(int i0;i<t;i) {solve();}} p…

java 高并發設計

文章目錄 目錄 文章目錄 前言 一、通用設計 一、動靜分離 二、數據庫獨立部署 三、問題 1.高并發通用設計方法 2.高并發系統的拆分順序 二、計算資源高并發 三、網絡資源高并發 超高性能場景&#xff08;10萬 QPS&#xff09; 中小規模場景&#xff08;5萬 QPS以下&a…

docker compose搭建elk 8.6.2

環境搭建 選用版本是比較新的版本 (ELK) 8.6.2 &#xff0c;elk的環境做的還是比較好的又windows和Linux多個版本&#xff0c;并且開箱即用。本地直接下載官方軟件也是可以的。最近在學習docker compose&#xff0c;就使用這個環境搭建一下。 前置條件 安裝好docker和 docke…

Springboot3+的id字符串轉化問題

以下是純后端實現 Long/BigInteger ID 轉為 JSON 字符串 的詳細配置方案&#xff0c;基于 Spring Boot 3 和 SpringDoc (OpenAPI) 最新實踐 ? 1. 添加依賴 確保你的 pom.xml&#xff08;或 Gradle&#xff09;中包含&#xff1a; <dependency><groupId>com.fast…

C#學習第30天: 匹配模式

模式匹配&#xff08;Pattern Matching&#xff09;是 C# 中一個強大且靈活的特性&#xff0c;允許開發者以更直觀的方式檢查數據結構&#xff0c;并根據特定模式執行操作。 隨著 C# 語言版本的發展&#xff0c;模式匹配的功能越來越豐富&#xff0c;為處理復雜數據提供了極大…

SQL進階之旅 Day 29:NoSQL結合使用策略

【SQL進階之旅 Day 29】NoSQL結合使用策略 文章簡述 隨著數據量的激增和業務場景的復雜化&#xff0c;傳統關系型數據庫在某些場景下已難以滿足高性能、高擴展性和靈活數據結構的需求。NoSQL&#xff08;非關系型數據庫&#xff09;以其高可擴展性、靈活的數據模型和分布式架構…

PostgreSQL 對 IPv6 的支持情況

PostgreSQL 對 IPv6 的支持情況 PostgreSQL 全面支持 IPv6 網絡協議&#xff0c;包括連接、存儲和操作 IPv6 地址。以下是詳細說明&#xff1a; 一、網絡連接支持 1. 監聽 IPv6 連接 在 postgresql.conf 中配置&#xff1a; listen_addresses 0.0.0.0,:: # 監聽所有IPv4…

模板字符串使用點擊事件【VUE3】

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 項目中使用模板字符串的時候很多&#xff0c;有些時候需要再模板字符串中使用點擊事件&#xff0c;那么在模板字符串中可以使用點擊事件么&#xff1f;如果這個點擊事件需要傳參呢&#xff1f; 答案…

AI——DeepSeek+LangChain+streamlit 實現智能汽車維修服務

效果圖 分析流程 代碼實現 廢話少說&#xff0c;直接上代碼 from langchain_core.language_models.llms import BaseLLM from langchain_core.outputs import Generation, LLMResult from pydantic.v1 import Field, validator from typing import Any, Dict, List, Optional…

《C++ 繼承》

目錄 繼承的定義 繼承類模板 派生類和基類之前的轉換 隱藏 派生類的默認成員函數 不能被繼承的類 繼承中的友元和靜態成員 繼承模型 繼承的定義 繼承的本質是一種復用。規定Person類為基類&#xff0c;Student類為派生類 。 繼承方式分為public繼承&#xff0c;prote…

金蝶K3 ERP 跨網段訪問服務器卡頓問題排查和解決方法

我一朋友公司反應&#xff0c;公司網絡卡頓&#xff0c;測試掉包嚴重&#xff0c;抓包wireshark測試&#xff0c;發現arp包有大量mac欺騙&#xff0c;因為公司有幾百臺電腦&#xff0c;所以建議更換了三層交換機&#xff0c;劃分了vlan&#xff0c;這樣有效的避免了網絡風暴等&…

無需安裝!在線數據庫工具 :實戰 SQL 語句經典案例

在數字化時代&#xff0c;SQL&#xff08;結構化查詢語言&#xff09;已成為數據從業者、開發人員乃至業務分析人員必備的核心技能。無論是處理日常數據報表&#xff0c;還是應對復雜的業務邏輯&#xff0c;SQL 都能高效實現數據的查詢、操作與分析。本文將通過經典的 SQL 練習…

如何在網頁里填寫 PDF下拉框

對于PDF 開發者或網頁開發者來說&#xff0c;讓用戶在網站上填寫 PDF 下拉框&#xff08;Combo Box&#xff09;是一個棘手的問題。因為 PDF 并不是一種原生的 Web 格式&#xff0c;瀏覽器通常不允許用戶與 PDF 下拉框進行交互。 那么&#xff0c;如何讓用戶在 HTML 中填寫 PD…