RabbitMQ最新入門教程

文章目錄

  • RabbitMQ最新入門教程
    • 1.什么是消息隊列
    • 2.為什么使用消息隊列
    • 3.消息隊列協議
    • 4.安裝Erlang
    • 5.安裝RabbitMQ
    • 6.RabbitMQ核心模塊
    • 7.RabbitMQ六大模式
      • 7.1 簡單模式
      • 7.2 工作模式
      • 7.3 發布訂閱模式
      • 7.4 路由模式
      • 7.5 主題模式
      • 7.6 RPC模式
    • 8.RabbitMQ四種交換機
      • 8.1 直連交換機
      • 8.2 主題交換機
      • 8.3 扇形交換機
      • 8.4 首部交換機
    • 9.RabbitMQ Management使用
      • 9.1 Queues操作
      • 9.2 Exchanges操作
    • 10.在Java中使用RabbitMQ
    • 11.SpringBoot整合RabbitMQ
    • 參考

RabbitMQ最新入門教程

1.什么是消息隊列

消息指的是兩個應用間傳遞的數據。數據的類型有很多種形式,可能只包含文本字符串,也可能包含嵌入對象。

“消息隊列(Message Queue)”是在消息的傳輸過程中保存消息的容器。在消息隊列中,通常有生產者和消費者兩個角色。生產者只負責發送數據到消息隊列,誰從消息隊列中取出數據處理,他不管。消費者只負責從消息隊列中取出數據處理,他不管這是誰發送的數據。

image-20250512095525228

常用的 MQ 有 ActiveMQ、RabbitMQ、Kafka、RocketMQ。

消息隊列誕生時間優點缺點使用場景特點
ActiveMQ2007 年功能全面,支持消息持久化、事務處理、集群等功能;跨平臺性和兼容性良好,能與不同系統集成性能在高并發場景下相對其他幾款稍遜一籌;配置復雜,容易出現性能問題;社區活躍度不如 RabbitMQ 和 Kafka適用于企業級應用中多種不同類型系統之間的消息通信和集成,例如,在包含多種不同技術架構子系統的大型企業應用中,作為消息橋梁實現各子系統之間的通信和協作功能全面、協議支持豐富、跨平臺性好
RabbitMQ2007 年可靠性高,支持多種消息持久化方式;路由功能強大,交換器類型豐富;客戶端支持廣泛,幾乎涵蓋所有主流編程語言;社區活躍,文檔豐富,易于學習和使用性能相對 Kafka 等稍低,在處理大規模、高并發消息時可能存在瓶頸;Erlang 語言編寫,對開發者技術棧有一定要求適用于各種規模的企業級應用,尤其是對消息可靠性和靈活性要求較高的場景,如電商系統中的訂單處理、物流通知,金融系統中的交易消息處理等可靠性強、路由靈活、語言支持廣泛
Kafka2011 年高吞吐量,能處理海量消息數據,低延遲;支持水平擴展,可通過添加節點增加處理能力;消息持久化到磁盤,數據可靠性高;適用于實時數據處理、日志收集和分析等場景不適合處理大量的小消息;對消息的順序性支持相對較弱,雖然可以通過一些配置保證,但會影響性能;運維相對復雜,需要一定的技術門檻常用于大數據處理、實時流計算、日志收集與分析等領域,如電商網站的用戶行為日志收集、金融行業的交易流水記錄等,以便進行實時分析和處理高吞吐量、可擴展性好、數據持久化
RocketMQ2012 年支持大規模消息堆積和高并發消息處理;提供豐富的消息過濾機制和事務消息功能;擴展性和運維管理能力良好開源社區活躍度相比 RabbitMQ 和 Kafka 稍低;對某些復雜場景的支持可能不夠靈活,需要一定的二次開發在電商、金融等領域應用廣泛,尤其適用于對消息可靠性、事務性和高并發處理要求較高的場景,如電商的訂單支付、庫存變更等業務場景支持高并發、消息過濾功能強大、事務消息支持

2.為什么使用消息隊列

  • 解耦。如圖所示。假設有系統B、C、D都需要系統A的數據,于是系統A調用三個方法發送數據到B、C、D。這時,系統D不需要了,那就需要在系統A把相關的代碼刪掉。假設這時有個新的系統E需要數據,這時系統A又要增加調用系統E的代碼。為了降低這種強耦合,就可以使用MQ,系統A只需要把數據發送到MQ,其他系統如果需要數據,則從MQ中獲取即可

    img

  • 異步。如圖所示。一個客戶端請求發送進來,系統A會調用系統B、C、D三個系統,同步請求的話,響應時間就是系統A、B、C、D的總和,也就是800ms。如果使用MQ,系統A發送數據到MQ,然后就可以返回響應給客戶端,不需要再等待系統B、C、D的響應,可以大大地提高性能。對于一些非必要的業務,比如發送短信,發送郵件等等,就可以采用MQ。

    img

  • 削峰。如圖所示。這其實是MQ一個很重要的應用。假設系統A在某一段時間請求數暴增,有5000個請求發送過來,系統A這時就會發送5000條SQL進入MySQL進行執行,MySQL對于如此龐大的請求當然處理不過來,MySQL就會崩潰,導致系統癱瘓。如果使用MQ,系統A不再是直接發送SQL到數據庫,而是把數據發送到MQ,MQ短時間積壓數據是可以接受的,然后由消費者每次拉取2000條進行處理,防止在請求峰值時期大量的請求直接發送到MySQL導致系統崩潰

    img

3.消息隊列協議

常見的消息中間件協議有:OpenWire、AMQP、MQTT、Kafka、OpenMessage協議。RabbitMQ 實現的兩個核心協議:AMQP 1.0 和 AMQP 0-9-1。

協議名稱簡介特點應用場景
OpenWireActiveMQ 默認的通信協議,基于 TCP/IP,提供了豐富的消息傳遞功能,支持多種編程語言。支持多種消息傳遞模式,如點對點、發布 / 訂閱等;具有較好的兼容性和擴展性。適用于企業級應用中,需要可靠消息傳遞和多種消息模式支持的場景。
AMQP(高級消息隊列協議)一種面向消息中間件的開放標準協議,具有豐富的功能集,支持事務、消息確認等。具有很強的規范性和通用性,支持多種語言,能保證消息的可靠傳遞和處理。常用于金融、電商等對數據一致性和可靠性要求較高的領域。
MQTT(消息隊列遙測傳輸)輕量級的發布 / 訂閱模式的消息傳輸協議,基于 TCP/IP,具有低帶寬、低功耗、高可靠性等特點。采用簡單的客戶端 - 服務器架構,消息以主題進行分類,適合資源受限的設備和網絡環境。廣泛應用于物聯網、移動應用、實時監控等場景,如智能家居設備之間的通信。
Kafka由 Apache 開發的分布式流平臺,其協議主要用于處理大規模的實時數據。具有高吞吐量、可擴展性、持久性和容錯性等特點,支持消息的批量處理和異步處理。常用于大數據處理、實時數據處理、日志收集等場景,如電商網站的用戶行為日志收集和分析。
OpenMessage是阿里云開源的新一代分布式消息中間件協議,旨在提供高性能、高可靠、高可擴展的消息通信能力。支持大規模集群部署,具有低延遲、高并發的特點,同時提供了豐富的消息特性,如事務消息、順序消息等。適用于互聯網公司的大規模分布式系統,尤其是對消息處理性能和可靠性要求極高的場景,如電商的訂單系統、物流系統等。

4.安裝Erlang

  • 安裝 Erlang。RabbitMQ 服務器是用 Erlang 語言編寫的,它的安裝包里并沒有集成 Erlang 的環境,因此需要先安裝 Erlang。下載鏈接,傻瓜式安裝,一直點next就行。

    image-20250512121239433

  • 為 Erlang 配置環境變量。「編輯系統環境變量」->「環境變量」->「系統變量」->「path」->「編輯」->「新建」,填入 Erlang 的 bin 路徑(D:\Erlang\Erlang OTP\bin)。

    image-20250512122438921

  • 驗證是否安裝成功。「cmd」->「輸入erl -version

    image-20250512122616612

5.安裝RabbitMQ

  • 安裝 RabbitMQ 服務器端,下載鏈接,傻瓜式安裝,一直點 next 就行。

  • 安裝完成后,進入安裝目錄(sbin 目錄下),運行 cmd,輸入 rabbitmqctl.bat status 可確認 RabbitMQ 的啟動狀態。

    image-20250512171706494

  • 輸入 rabbitmq-plugins enable rabbitmq_management,啟用客戶端管理 UI 的插件。

    image-20250512172020721

  • 在瀏覽器地址欄輸入 http://localhost:15672/ 進入管理端界面。賬號與密碼默認是:guest/guest。出現如下界面,則表示安裝成功完成。

    image-20250512172333833

note:在通過 rabbitmqctl.bat status 查看 RabbitMQ 的啟動狀態時,出現了錯誤。Error: unable to perform an operation on node 'rabbit@WIN-H34GJTET6NT'. Please see diagnostics information and suggestions below. 這個錯誤是因為 erlang 和 rabbitmq 的 .erlang.cookie 不同步所導致的。

解決辦法:將 C:\Users\Administrator\.erlang.cookie 復制到 C:\Windows\System32\config\systemprofile 目錄,重啟 rabbitMQ 服務。

6.RabbitMQ核心模塊

image-20250512175323132

  • Publisher:生產者,發送消息給交換機。
  • consumer:消費者,消費消息,和隊列進行綁定。
  • exchange:交換機,負責消息路由。生產者發送的消息由交換機決定投遞到哪個隊列。交換機只能路由消息,無法存儲消息。交換機只會路由消息給與其綁定的隊列,因此隊列必須與交換機綁定。
  • queue:隊列,存儲消息。生產者投遞的消息會暫存在消息隊列中,等待消費者處理。
  • Virtual Host:虛擬主機,起到數據隔離的作用。每個虛擬主機相互獨立,有各自的exchange、queue,因為RabiitMQ性能很強,單個項目使用會造成巨大的浪費,所以多個項目,實現一套MQ,virtual host就是為了不同交換機產生隔離。

7.RabbitMQ六大模式

7.1 簡單模式

簡單模式是最基本的工作模式,也是最簡單的消息傳遞模式。在簡單模式中,一個生產者將消息發到一個隊列中,一個消費者從隊列中獲取并消費消息。這種模式適用于單個生產者和單個消費者的簡單場景,消息的處理是同步的。

image-20250513171215013

7.2 工作模式

工作模式用于實現一個任務在多個消費者之間的并發處理,在工作隊列模式中,一個生產者將消息發到一個隊列中,多個消費者從隊列中獲取并處理消息,每個消息只能被一個消費者處理。這種模式適用于多個消費者并發處理消息的情況,提高了系統的處理能力和吞吐量。

image-20250513171518789

7.3 發布訂閱模式

發布/訂閱模式用于實現一條消息被多個消費者同時接受和處理。在發布/訂閱模式中,一個生產者將消息發送到交換器(Exchange)中,交換器將消息廣播到所有綁定的隊列,每個隊列對應一個消費者。這種模式適用于消息需要被多個消費者同時接受和處理的廣播場景,如日志訂閱和消息通知等。

image-20250513171714911

7.4 路由模式

路由模式用于實現根據消息的路由鍵(Routing Key)將消息路由到不同的隊列中。在路由模式中,一個生產者將消息發送到交換器中,并制定消息的路由鍵,交換器根據路由鍵將消息路由到與之匹配的隊列中。這種模式適用于根據不同的條件將消息分發到不同的隊列中,以實現消息的篩選和分發。

image-20250513171833186

7.5 主題模式

主題模式是一種更靈活的消息路由,它使用通配符匹配路由鍵,將消息路由到多個隊列中。在主題模式中,一個生產者將消息發送到交換器中,并指定主題(Topic)作為路由鍵,交換器根據通配符匹配將消息路由到與之匹配的隊列中。

image-20250513172016870

7.6 RPC模式

RPC模式是一種用于實現分布式系統中遠程調用的工作模式。指的是通過RabbitMQ來實現一種RPC的能力。

image-20250513172138672

8.RabbitMQ四種交換機

生產者發布消息、消費者接收消息,但是這中間的消息是怎么傳遞的,就用到了一個很重要的概念交換機(Exchange),RabbitMQ 消息投遞到交換機上之后,通過路由關系再投遞到指定的一個或多個隊列上。

Exchange 參數介紹

  • Name:交換機名稱
  • Type:交換機類型 direct、topic、fanout、headers
  • Durability:是否需要持久化
  • Auto Delete:最后一個綁定到 Exchange 上的隊列刪除之后自動刪除該 Exchange
  • Internal:當前 Exchange 是否應用于 RabbitMQ 內部使用,默認false。
  • Arguments:擴展參數

Exchange 四種類型

  • direct:不需要 Exchange 進行綁定,根據 RoutingKey 匹配消息路由到指定的隊列。
  • topic:生產者指定 RoutingKey 消息根據消費端指定的隊列通過模糊匹配的方式進行相應轉發,兩種通配符模式:
    • #:可匹配一個或多個關鍵字
    • *:只能匹配一個關鍵字
  • fanout:這種模式只需要將隊列綁定到交換機上即可,是不需要設置路由鍵的。
  • headers:根據發送消息內容中的 headers 屬性來匹配

8.1 直連交換機

direct 通過 RoutingKey 匹配消息路由到指定的隊列,因此也可以無需指定交換機,在不指定交換機的情況下會使用 AMQP default 默認的交換機,另外在消息投遞時要注意 RoutingKey 要完全匹配才能被隊列所接收,否則消息會被丟棄的。

image-20250513174139959

上圖三個隊列,第一個隊列的 Binding routingKey 為 black,第二個隊列和第三個隊列的 Binding routingKey 為 green,也很清晰的能看到消息投遞 1 僅被 Queue1 接收,而 消息投遞 2 同時可以被廣播到 Queue2 和 Queue3,這是因為 Queue2 和 Queue3 的路由鍵是相同的,再一次的說明了交換機的 direct 模式是通過 RoutingKey 進行消息路由的

8.2 主題交換機

生產者指定 RoutingKey ,消費端根據指定的隊列通過模糊匹配的方式進行相應轉發。

image-20250513174553662

上圖展示了交換機 Topic 模式的消息流轉過程,Queue1 的路由鍵通過使用 \* 符合匹配到了 black.test1 和 black.test2 但是 black.test3.1 由于有多個關鍵字是匹配不到的。另一個隊列 Queue2 使用了 # 符號即可以一個也可以匹配多個關鍵字,同時匹配到了 black.test4 和 black.test5.1。

8.3 扇形交換機

fanout 只需要將隊列綁定到交換機上即可,是不需要設置路由鍵的,便可將消息轉發到綁定的隊列上,由于不需要路由鍵,所以 fanout 也是四個交換機類型中最快的一個,如果是做廣播模式的就很適合。

image-20250513174819470

8.4 首部交換機

Headers 類型的交換機是根據發送消息內容中的 headers 屬性來匹配的,headers 類型的交換機基本上不會用到,因此這里也不會過多介紹,掌握以上三種類型的交換機模型在平常的業務場景中就足夠了。

9.RabbitMQ Management使用

通過 http://localhost:15672 訪問 RabbitMQ 的控制臺管理工具 RabbitMQ Management,用戶名/密碼都是 guest。

9.1 Queues操作

  • 創建隊列。點擊「導航欄Queues」->「Add a new queue」展開隊列信息,填好信息后,add 添加。

    image-20250513194945485

  • 添加成功后,可以在 All queues 下看到添加的隊列。點擊隊列名就會跳轉到隊列詳情頁面。

    image-20250513195437252

  • 在隊列詳情頁面,可以進行一些操作,如下圖所示。

    image-20250513195833032

9.2 Exchanges操作

  • 創建隊列。點擊「導航欄Exchanges」->「Add a new exchange」展開交換機信息,填好信息后,add 添加。

    image-20250513201112757

  • 在交換機詳情頁面,同樣可以進行一些操作,如下圖所示。

    image-20250513201917895

10.在Java中使用RabbitMQ

模擬一個最簡單的場景,一個生產者發送消息到隊列中,一個消費者從隊列中讀取消息并打印。

  • 第一步,在項目中添加 RabbitMQ 客戶端依賴:

    <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.22.0</version>
    </dependency>
    <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.16</version>
    </dependency>
    <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>2.0.16</version><!-- 注意,若無type為jar則報錯--><type>jar</type>
    </dependency>
    

    note:如果沒有導入 slf4j-api 和 slf4j-simple 依賴,會報錯 SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”. SLF4J: Defaulting to no-operation (NOP) logger implementation. 如下:

    image-20250513233624699

  • 第二步,創建生產者類。

    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;
    import java.nio.charset.StandardCharsets;
    import java.util.concurrent.TimeoutException;public class Producer {// 聲明隊列名稱,設置為final static表示全局唯一常量private final static String QUEUE_NAME = "test";public static void main(String[] args) throws IOException, TimeoutException {// 創建RabbitMQ連接工廠實例ConnectionFactory factory = new ConnectionFactory();// 使用try-with-resources自動關閉連接和通道try(Connection connection = factory.newConnection();Channel channel = connection.createChannel()){// 聲明持久化隊列(durable=true),若隊列不存在則創建channel.queueDeclare(QUEUE_NAME, true, false, false, null);// 定義要發送的消息內容String message = "this is a rabbitmq test in java";// 發布消息到默認交換機(""),路由到指定隊列channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));// 打印發送成功的消息內容System.out.println("發送消息:"+ message);}// 資源會在此自動關閉}
    }
    
  • 第三步,創建消費者類。

    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    import com.rabbitmq.client.DeliverCallback;import java.io.IOException;
    import java.nio.charset.StandardCharsets;
    import java.util.concurrent.TimeoutException;public class Consumer {// 與生產者保持一致的隊列名稱private final static String QUEUE_NAME = "test";public static void main(String[] args) throws IOException, TimeoutException {// 創建RabbitMQ連接工廠ConnectionFactory factory = new ConnectionFactory();// 建立TCP連接Connection connection = factory.newConnection();// 創建AMQP通道(輕量級連接)Channel channel = connection.createChannel();// 聲明持久化隊列(需與生產者配置一致)channel.queueDeclare(QUEUE_NAME, true, false, false, null);System.out.println("等待接收消息");// 定義消息回調函數,處理接收到的消息DeliverCallback deliverCallback = (consumerTag, delivery) -> {// 將字節數組轉換為UTF-8字符串String message = new String(delivery.getBody(), StandardCharsets.UTF_8);System.out.println("接收消息:" + message);};// 啟動消費者并設置自動確認模式(autoAck=true)channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { // 消費者取消時的回調(空實現)});}
    }
    
  • 第四步,運行,查看效果。

    image-20250513235510056

11.SpringBoot整合RabbitMQ

  • 新建一個 SpringBoot 項目。

    image-20250514093049642

  • 修改 pom.xml 文件,添加 RabbitMQ 依賴。

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.9</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>org.example</groupId><artifactId>RabbitMQSpring</artifactId><version>0.0.1-SNAPSHOT</version><name>RabbitMQSpring</name><description>RabbitMQSpring</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
    
  • 將配置文件 application.properties 重命名為 application.yml,并修改配置文件的內容。

    spring:application:name: RabbitMQSpringrabbitmq:host: localhostport: 5672username: guestpassword: guestvirtual-host: /server:port: 8088logging:level:org.example.rabbitmqspring: debug
    
  • 在項目根目錄下創建 config 包,在 config 包下創建一個 RabbitMQ 配置類 RabbitMQConfig。

    package org.example.rabbitmqspring.config;import org.springframework.amqp.core.Binding;
    import org.springframework.amqp.core.BindingBuilder;
    import org.springframework.amqp.core.DirectExchange;
    import org.springframework.amqp.core.Queue;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;@Configuration
    public class RabbitMQConfig {// 交換機的名稱public static final String DEFAULT_EXCHANGE = "exchange";// 路由Key的名稱public static final String DEFAULT_ROUTE = "route";// 隊列的名稱public static final String DEFAULT_QUEUE = "queue";/*** 聲明交換機* @return DirectExchange*/@Beanpublic DirectExchange exchange() {return new DirectExchange(DEFAULT_EXCHANGE);}/*** 聲明隊列* @return Queue*/@Beanpublic Queue queue(){return new Queue(DEFAULT_QUEUE);}/*** 聲明路由Key(交換機和隊列的關系)* @param exchange DirectExchange* @param queue Queue* @return Binding*/@Beanpublic Binding binding(DirectExchange exchange, Queue queue){return BindingBuilder.bind(queue).to(exchange).with(DEFAULT_ROUTE);}}
    
  • 在項目根目錄下創建 producer 包,在 producer 包下創建一個 RabbitProducer 類。

    package org.example.rabbitmqspring.producer;import org.example.rabbitmqspring.config.RabbitMQConfig;
    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;/*** RabbitMQ消息生產者組件,負責將消息發送到指定隊列* 基于Spring AMQP的RabbitTemplate實現消息發送*/
    @Component  // 聲明為Spring管理的組件,會自動掃描并注冊到應用上下文中
    public class RabbitProducer {private final RabbitTemplate rabbitTemplate;  // RabbitMQ操作模板,用于發送和接收消息@Autowired  // 通過構造器注入RabbitTemplate實例public RabbitProducer(RabbitTemplate rabbitTemplate){this.rabbitTemplate = rabbitTemplate;}/*** 發送消息到默認交換機和路由* @param message 待發送的消息內容*/public void sendMessage(String message){ // 調用RabbitTemplate將消息轉換并發送到指定交換機和路由鍵rabbitTemplate.convertAndSend(RabbitMQConfig.DEFAULT_EXCHANGE, RabbitMQConfig.DEFAULT_ROUTE, message);}
    }
    
  • 在項目根目錄下創建 consumer 包,在 consumer 包下創建一個 RabbitConsumer 類。

    package org.example.rabbitmqspring.consumer;import org.example.rabbitmqspring.config.RabbitMQConfig;
    import org.springframework.amqp.rabbit.annotation.RabbitHandler;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Component;/*** RabbitMQ消息消費者組件,自動監聽配置的默認隊列* 基于Spring AMQP的注解驅動模型實現消息監聽*/
    @Component  // 聲明為Spring組件,由Spring容器管理實例化
    @RabbitListener(queues = RabbitMQConfig.DEFAULT_QUEUE)  // 監聽配置類中定義的默認隊列
    public class RabbitMQConsumer {/*** 消息處理方法,當隊列接收到新消息時自動觸發* @param message 從隊列中獲取的字符串消息體*/@RabbitHandler  // 聲明為RabbitMQ消息處理方法public void receive(String message){System.out.printf("收到一條消息: %s", message);}
    }
    
  • 在項目根目錄下創建 controller 包,在 controller 包下創建一個 MessageController 類。

    package org.example.rabbitmqspring.controller;import org.example.rabbitmqspring.producer.RabbitProducer;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;@RestController  // 聲明該類為RESTful風格的控制器,會自動將返回值轉換為JSON格式
    @RequestMapping(path = "/message", produces = "application/json;charset=utf-8")  // 映射請求路徑,設置響應內容類型為JSON且字符集為UTF-8
    public class MessageController {private final RabbitProducer producer;  // 依賴注入RabbitMQ消息生產者@Autowired  // 自動注入RabbitProducer實例public MessageController(RabbitProducer producer){this.producer = producer;}@RequestMapping(value = "/send", method = RequestMethod.POST)  // 映射/send路徑的POST請求public void sendMessage(String message){  // 處理發送消息的請求,接收一個字符串類型的消息producer.sendMessage(message);  // 調用生產者的發送消息方法}
    }
    
  • 使用 API 測試工具,測試發送消息。

    測試工具推薦:Postman、Apifox。

    由于 Postman 需要訪問外網才能使用,不支持中文等使用門檻,對于國內開發者來說并不是一個最好的首選 API 管理工具,所以 Apifox 會更適合我們使用。

    image-20250515191210914

    image-20250515191453107

🤗🤗🤗

參考

  • 超詳細的RabbitMQ入門,看這篇就夠了!
  • 圖文實踐 RabbitMQ 不同類型交換機消息投遞機制
  • RabbitMQ的介紹
  • RabbitMQ安裝和使用詳細教程

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

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

相關文章

工具學習_VirusTotal使用

VirusTotal Intelligence 允許用戶在其龐大的數據集中進行搜索&#xff0c;以查找符合特定條件的文件&#xff0c;例如哈希值、殺毒引擎檢測結果、元數據信息、提交時的文件名、文件結構特征、文件大小等。可以說&#xff0c;它幾乎是惡意軟件領域的“谷歌搜索引擎”。 網頁使…

計算機系統----軟考中級軟件設計師(自用學習筆記)

目錄 1、計算機的基本硬件系統 2、CPU的功能 3、運算器的組成 4、控制器 5、計算機的基本單位 6、進制轉換問題 7、原碼、反碼、補碼、移碼 8、浮點數 9、尋址方式 10、奇偶校驗碼 11、海明碼 12、循環冗余校驗碼 13、RISC和CISC 14、指令的處理方式 15、存儲器…

揚州卓韻酒店用品:優質洗浴用品,提升酒店滿意度與品牌形象

在酒店提供的服務里&#xff0c;沐浴用品占據了非常重要的地位&#xff0c;其質量與種類直接關系到客人洗澡時的感受。好的沐浴用品能讓客人洗澡時感到舒心和快樂&#xff0c;反之&#xff0c;質量不好的用品可能會影響客人整個住宿期間的愉悅心情。挑選恰當的洗浴用品不僅能夠…

學習筆記:黑馬程序員JavaWeb開發教程(2025.4.5)

12.4 登錄認證-登錄校驗-會話跟蹤方案一 設置cookie&#xff0c;服務器給瀏覽器響應數據&#xff0c;通過control方法形參當中獲取response&#xff0c;調用response當中的addCookie方法實現 獲取cookie&#xff0c;調用getCookie方法 用戶可以通過瀏覽器設置禁用cookie 跨域…

進程替換講解

1. 基本概念 1.1 進程替換 vs. 進程創建 進程創建&#xff1a;使用fork()或clone()等系統調用創建一個新的子進程&#xff0c;子進程是父進程的副本&#xff0c;擁有相同的代碼和數據。進程替換&#xff1a;使用exec系列函數在當前進程中加載并執行一個新的程序&#xff0c;替…

【微服務】SpringBoot + Docker 實現微服務容器多節點負載均衡詳解

目錄 一、前言 二、前置準備 2.1 基本環境 2.2 準備一個springboot工程 2.2.1 準備幾個測試接口 2.3 準備Dockerfile文件 2.4 打包上傳到服務器 三、制作微服務鏡像與運行服務鏡像 3.1 拷貝Dockerfile文件到服務器 3.2 制作服務鏡像 3.3 啟動鏡像服務 3.4 訪問一下服…

1.2.2.1.4 數據安全發展技術發展歷程:高級公鑰加密方案——同態加密

引言 在密碼學領域&#xff0c;有一種技術被圖靈獎得主、著名密碼學家Oded Goldreich譽為"密碼學圣杯"&#xff0c;那就是全同態加密&#xff08;Fully Homomorphic Encryption&#xff09;。今天我們就來聊聊這個神秘而強大的加密方案是如何從1978年的概念提出&…

vllm量化03—INT4 W4A16

本系列基于Qwen2.5-7B&#xff0c;學習如何使用vllm量化&#xff0c;并使用benchmark_serving.py、lm_eval 測試模型性能和評估模型準確度。 測試環境為&#xff1a; OS: centos 7 GPU: nvidia l40 driver: 550.54.15 CUDA: 12.3本文是該系列第3篇——INT4 W4A16 一、量化 f…

第二十五天打卡

常見報錯類型 try-except-else-finally 語句 首先執行try語句&#xff0c;若正確直接執行else語句 若try語句發生錯誤&#xff0c;則判斷錯誤類型&#xff0c;執行錯誤類型對應的except語句&#xff0c;不執行else語句 finally語句無條件執行&#xff0c;多用于資源保存&…

城市掃街人文街頭紀實膠片電影感Lr調色預設,DNG/手機適配濾鏡!

調色詳情 城市掃街人文街頭紀實膠片電影感 Lr 調色是通過 Lightroom&#xff08;Lr&#xff09;軟件&#xff0c;對城市街頭抓拍的人文紀實照片進行后期調色處理。旨在賦予照片如同膠片拍攝的質感以及電影般濃厚的敘事氛圍&#xff0c;不放過每一個日常又珍貴的瞬間&#xff0c…

【hadoop】Kafka 安裝部署

一、Kafka安裝與配置 步驟&#xff1a; 1、使用XFTP將Kafka安裝包kafka_2.12-2.8.1.tgz發送到master機器的主目錄。 2、解壓安裝包&#xff1a; tar -zxvf ~/kafka_2.12-2.8.1.tgz 3、修改文件夾的名字&#xff0c;將其改為kafka&#xff0c;或者創建軟連接也可&#xff1…

UDP 多點通信

一、setsockopt/getsockopt 函數詳解 1. 函數原型 c #include <sys/socket.h> int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);…

說一說Node.js高性能開發中的I/O操作

眾所周知&#xff0c;在軟件開發的領域中&#xff0c;輸入輸出&#xff08;I/O&#xff09;操作是程序與外部世界交互的重要環節&#xff0c;比如從文件讀取數據、向網絡發送請求等。這段時間&#xff0c;也指導項目中一些項目的開發工作&#xff0c;發現在Node.js運用中&#…

Charles抓包并破解ProtoBuf請求

安裝Charles并抓包 如果是外網的需要root安裝一系列證書等&#xff0c;詳細見參考文章&#xff1a; 在雷電模擬器安卓7.0上使用Charles抓包詳細教程 遇到如下問題&#xff1a; 1.粘貼到目錄/system/etc/security/cacerts內&#xff0c;粘貼不了。需要打開這個 2.模擬器wifi打…

Odoo 18 安全組與訪問權限管理指南

Odoo 18 安全組與訪問權限管理指南 一、準備工作&#xff1a;在自定義模塊中創建安全配置文件 創建 security 文件夾 在自定義模塊內創建名為 security 的文件夾&#xff0c;用于存放安全組和訪問權限的定義文件。 二、定義模型訪問權限&#xff1a;ir.model.access.csv 文…

使用lldb查看Rust不同類型的結構

目錄 前言 正文 標量類型 復合類型——元組 復合類型——數組 函數 &str struct 可變數組vec Iter String Box Rc Arc RefCell Mutex RwLock Channel 總結 前言 筆者發現這個lldb挺好玩的&#xff0c;可以查看不同類型的結構&#xff0c;雖然這好像是C的東…

uniapp使用ui.request 請求流式輸出

正文&#xff1a; 在現代Web開發中&#xff0c;實時數據流和長時間運行的請求變得越來越常見&#xff0c;尤其是在處理大量數據或進行實時通信時。在這種情況下&#xff0c;uniapp 提供的 ui.request 請求方法可以幫助我們輕松實現流式輸出請求。本文將介紹如何使用 uni.reques…

如何恢復被勒索軟件加密的服務器文件(解密與備份策略)

針對勒索軟件加密文件的恢復和解密策略&#xff0c;結合當前數據安全最佳實踐&#xff0c;整理應對指南如下&#xff1a; 一、文件解密與修復方法 立即隔離設備? 斷開網絡連接并禁用共享功能&#xff0c;防止病毒橫向傳播 通過文件后綴異常&#xff08;如.locked、.wxx&…

JS,ES,TS三者什么區別

Java Script(JS)、ECMAScript(ES)、TypeScript(TS) 的核心區別與關聯的詳細解析,結合技術背景、設計目標及應用場景展開說明: 一、核心定義與關系 JavaScript(JS) 定義:一種動態類型、基于原型的腳本語言,由 Netscape 公司于 1995 年首次開發,用于網頁交互功能。角…

【MapReduce入門】深度解析MapReduce:定義、核心特點、優缺點及適用場景

目錄 1 什么是MapReduce&#xff1f; 2 MapReduce的核心特點 2.1 分布式處理 2.2 容錯機制 3 MapReduce的完整工作流程 4 MapReduce的優缺點分析 4.1 優勢 4.2 局限性 5 MapReduce典型應用場景 5.1 適用場景 5.2 不適用場景 6 MapReduce與其他技術的對比 7 總結 1…