最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 整合 RabbitMQ從入門到實戰(zhàn)步驟

 更新時間:2026年01月05日 10:12:57   作者:無欲無為  
本文詳細介紹了如何在SpringBoot項目中整合RabbitMQ,涵蓋基礎(chǔ)配置、消息發(fā)送與接收、高級特性如手動確認和死信隊列,以及性能調(diào)優(yōu)建議,通過實踐步驟,讀者可以構(gòu)建一個高可靠、高性能的分布式系統(tǒng),感興趣的朋友跟隨小編一起看看吧

在分布式系統(tǒng)開發(fā)中,消息隊列是解耦服務(wù)、提升可靠性的關(guān)鍵組件。RabbitMQ 作為業(yè)界廣泛使用的消息中間件,與 Spring Boot 的整合能顯著提升開發(fā)效率。本文將手把手教你完成 Spring Boot 與 RabbitMQ 的整合,涵蓋基礎(chǔ)配置、消息發(fā)送與接收,以及高級特性如手動確認和消息確認機制。

1.環(huán)境準備

確保已安裝 JDK 1.8+、Maven 3.0+ 和 RabbitMQ 服務(wù)。RabbitMQ 可通過 Docker 快速啟動:

docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management

2.創(chuàng)建 Spring Boot 項目

使用 Spring Initializr 創(chuàng)建項目,添加以下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

3.配置 RabbitMQ 連接

src/main/resources/application.yml中配置連接參數(shù):

spring:
  rabbitmq:
    host: localhost       # RabbitMQ 服務(wù)器地址
    port: 5672           # 默認端口
    username: guest      # 默認用戶名
    password: guest      # 默認密碼
    virtual-host: /      # 虛擬主機(默認)
    publisher-confirm-type: correlated  # 開啟消息確認
    publisher-returns: true             # 開啟消息失敗回調(diào)
    listener:
      simple:
        acknowledge-mode: manual       # 手動確認消息
        prefetch: 1                    # 每次預(yù)取的消息數(shù)

4.聲明隊列和交換機

創(chuàng)建配置類定義隊列、交換機及綁定關(guān)系:

@Configuration
public class RabbitConfig {
    // 直連交換機
    public static final String DIRECT_EXCHANGE = "direct_exchange";
    // 隊列
    public static final String DIRECT_QUEUE = "direct_queue";
    // 路由鍵
    public static final String ROUTING_KEY = "routing_key";
    @Bean
    public Exchange directExchange() {
        return ExchangeBuilder.directExchange(DIRECT_EXCHANGE).build();
    }
    @Bean
    public Queue directQueue() {
        return new Queue(DIRECT_QUEUE, true); // durable=true 表示持久化
    }
    @Bean
    public Binding binding(Queue queue, Exchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
    }
}

5.生產(chǎn)者(發(fā)送消息)

創(chuàng)建 RabbitProducer.java 注入 RabbitTemplate 發(fā)送消息:

@Service
public class RabbitProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    public void sendMessage(String message) {
        rabbitTemplate.convertAndSend(
            RabbitConfig.DIRECT_EXCHANGE, 
            RabbitConfig.ROUTING_KEY, 
            message
        );
    }
}

6.消費者(接收消息)

創(chuàng)建 RabbitConsumer.java 監(jiān)聽隊列:

@Service
public class RabbitConsumer {
    @RabbitListener(queues = RabbitConfig.DIRECT_QUEUE)
    public void receiveMessage(String message) {
        System.out.println("收到消息: " + message);
        // 手動確認消息(需配置 acknowledge-mode: manual)
        // 實際項目中需處理異常和重試邏輯
    }
}

7.消息確認機制

生產(chǎn)者確認 

在 application.yml 中已配置 publisher-confirm-type: correlated,可通過回調(diào)確認消息是否成功到達交換機:

@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
    RabbitTemplate template = new RabbitTemplate(connectionFactory);
    template.setConfirmCallback((correlationData, ack, cause) -> {
        if (ack) {
            System.out.println("消息確認成功");
        } else {
            System.err.println("消息確認失敗: " + cause);
        }
    });
    template.setMandatory(true); // 開啟強制回調(diào)
    return template;
}

消費者確認:配置 acknowledge-mode: manual 后,需在消費者中手動確認:

@RabbitListener(queues = RabbitConfig.DIRECT_QUEUE)
public void receiveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {
    try {
        System.out.println("處理消息: " + message);
        channel.basicAck(deliveryTag, false); // 確認消息
    } catch (Exception e) {
        channel.basicNack(deliveryTag, false, true); // 拒絕消息并重新入隊
    }
}

8.死信隊列配置

處理無法被消費的消息,創(chuàng)建死信隊列并綁定:

@Bean
public Queue deadLetterQueue() {
    Map<String, Object> args = new HashMap<>();
    args.put("x-dead-letter-exchange", "dlx_exchange"); // 指定死信交換機
    args.put("x-dead-letter-routing-key", "dlx_routing_key");
    return new Queue("dlx_queue", true, false, false, args);
}

9.測試與驗證

確保 RabbitMQ 服務(wù)已啟動(默認端口 15672 為管理界面)。

創(chuàng)建 RabbitMQApplicationTests.java

@SpringBootTest
@AutoConfigureMockMvc
public class RabbitMQApplicationTests {
    @Autowired
    private RabbitProducer producer;
    @Test
    public void testSendMessage() {
        producer.sendMessage("Hello RabbitMQ!");
    }
}

10.常見問題與解決方案

連接失敗‌:檢查 host 和 port 是否正確,確保 RabbitMQ 服務(wù)已啟動。
消息未消費‌:確認消費者監(jiān)聽的是正確的隊列,檢查 acknowledge-mode 配置。
性能調(diào)優(yōu)‌:調(diào)整 prefetch-count 和 concurrency 參數(shù)優(yōu)化吞吐量。

11.總結(jié)

本文從零開始實現(xiàn)了 Spring Boot 與 RabbitMQ 的整合,涵蓋基礎(chǔ)配置、消息發(fā)送與接收、高級特性(如手動確認和死信隊列)。通過合理使用這些特性,可以構(gòu)建高可靠、高性能的分布式系統(tǒng)。如需進一步學(xué)習(xí),可參考 RabbitMQ 官方文檔。

到此這篇關(guān)于Spring Boot 整合 RabbitMQ從入門到實戰(zhàn)步驟的文章就介紹到這了,更多相關(guān)Spring Boot 整合 RabbitMQ內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Token登陸驗證機制的原理及實現(xiàn)

    Token登陸驗證機制的原理及實現(xiàn)

    這篇文章介紹了Token登陸驗證機制的原理及實現(xiàn),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • Java 改造ayui表格組件實現(xiàn)多重排序

    Java 改造ayui表格組件實現(xiàn)多重排序

    layui 的表格組件目前只支持單列排序,在實際應(yīng)用中并不能很好的支撐我們的業(yè)務(wù)需求。今天一時手癢,決定改造一番以支持多重排序。
    2021-04-04
  • 寧可用Lombok也不把成員設(shè)置為public原理解析

    寧可用Lombok也不把成員設(shè)置為public原理解析

    這篇文章主要為大家介紹了寧可用Lombok也不把成員設(shè)置為public原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 淺析MMAP零拷貝在RocketMQ中的運用

    淺析MMAP零拷貝在RocketMQ中的運用

    零拷貝技術(shù)可以減少數(shù)據(jù)拷貝和共享總線操作的次數(shù),消除傳輸數(shù)據(jù)在存儲器之間不必要的中間拷貝次數(shù),從而有效地提高數(shù)據(jù)傳輸效率,這篇文章主要介紹了MMAP零拷貝在RocketMQ中的運用,需要的朋友可以參考下
    2022-07-07
  • java/word+fusionchart生成圖表深入分析

    java/word+fusionchart生成圖表深入分析

    本文將以java/word+fusionchart生成圖表問題深入解析,有興趣的朋友可以參考下
    2012-11-11
  • Springboot整合Java?DL4J實現(xiàn)交通標志識別系統(tǒng)全過程

    Springboot整合Java?DL4J實現(xiàn)交通標志識別系統(tǒng)全過程

    在自動駕駛系統(tǒng)中,交通標志識別是實現(xiàn)車輛智能化的關(guān)鍵技術(shù)之一,本文介紹了利用SpringBoot和JavaDeeplearning4j構(gòu)建交通標志識別系統(tǒng)的方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-10-10
  • JAVA中String介紹及常見面試題小結(jié)

    JAVA中String介紹及常見面試題小結(jié)

    這篇文章主要介紹了JAVA中String介紹及常見面試題,在java面試中經(jīng)常會被面試官問到,小編通過實例代碼相結(jié)合給大家詳細介紹,需要的朋友可以參考下
    2020-02-02
  • Java把list分成多個list的方法示例

    Java把list分成多個list的方法示例

    在編程中將大的list集合拆分為多個小集合可以提高處理效率,主要拆分方法包括等量拆分適用于均勻處理數(shù)據(jù)、?指定數(shù)量拆分按固定子集大小劃分、根據(jù)條件拆分按特定規(guī)則進行,這些方法有助于多線程異步處理,需要的朋友可以參考下
    2024-11-11
  • 解決在Idea 2020.2下使用 Lombok的注解不生效的問題(插件安裝了,依賴也寫了,自動注解也設(shè)置了)

    解決在Idea 2020.2下使用 Lombok的注解不生效的問題(插件安裝了,依賴也寫了,自動注解也設(shè)置了)

    這篇文章主要介紹了在Idea 2020.2下使用 Lombok的注解不生效的問題(插件安裝了,依賴也寫了,自動注解也設(shè)置了),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • JDK10新特性之var泛型和多個接口實現(xiàn)方法

    JDK10新特性之var泛型和多個接口實現(xiàn)方法

    這篇文章主要介紹了JDK10的新特性:var泛型和多個接口實現(xiàn)方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05

最新評論

嘉鱼县| 城市| 阳曲县| 兴文县| 荥经县| 巴南区| 湛江市| 遂宁市| 易门县| 河北省| 常德市| 广元市| 菏泽市| 正安县| 泰兴市| 津市市| 开原市| 阿勒泰市| 民丰县| 石楼县| 河北区| 苗栗县| 碌曲县| 蛟河市| 东方市| 夏津县| 营山县| 关岭| 双流县| 文水县| 米易县| 揭西县| 沂源县| 富民县| 遂川县| 特克斯县| 肃宁县| 元谋县| 茌平县| 林口县| 双鸭山市|