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

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

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

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

1.環(huán)境準(zhǔ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           # 默認(rèn)端口
    username: guest      # 默認(rèn)用戶名
    password: guest      # 默認(rèn)密碼
    virtual-host: /      # 虛擬主機(jī)(默認(rèn))
    publisher-confirm-type: correlated  # 開啟消息確認(rèn)
    publisher-returns: true             # 開啟消息失敗回調(diào)
    listener:
      simple:
        acknowledge-mode: manual       # 手動確認(rèn)消息
        prefetch: 1                    # 每次預(yù)取的消息數(shù)

4.聲明隊列和交換機(jī)

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

@Configuration
public class RabbitConfig {
    // 直連交換機(jī)
    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.消費(fèi)者(接收消息)

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

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

7.消息確認(rèn)機(jī)制

生產(chǎn)者確認(rèn) 

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

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

消費(fèi)者確認(rèn):配置 acknowledge-mode: manual 后,需在消費(fèi)者中手動確認(rèn):

@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); // 確認(rèn)消息
    } catch (Exception e) {
        channel.basicNack(deliveryTag, false, true); // 拒絕消息并重新入隊
    }
}

8.死信隊列配置

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

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

9.測試與驗證

確保 RabbitMQ 服務(wù)已啟動(默認(rèn)端口 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ù)已啟動。
消息未消費(fèi)‌:確認(rèn)消費(fèi)者監(jiān)聽的是正確的隊列,檢查 acknowledge-mode 配置。
性能調(diào)優(yōu)‌:調(diào)整 prefetch-count 和 concurrency 參數(shù)優(yōu)化吞吐量。

11.總結(jié)

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

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

相關(guān)文章

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

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

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

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

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

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

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

    淺析MMAP零拷貝在RocketMQ中的運(yùn)用

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論

红河县| 厦门市| 揭阳市| 巧家县| 辰溪县| 即墨市| 林西县| 赫章县| 凤城市| 色达县| 卢湾区| 和平县| 遵义县| 河北省| 嘉善县| 会同县| 师宗县| 霍邱县| 黄山市| 安乡县| 于都县| 鹿邑县| 古丈县| 兰西县| 昌吉市| 永福县| 揭东县| 香港| 探索| 云霄县| 岑巩县| 永安市| 承德县| 南安市| 阿克| 舟山市| 竹山县| 宣城市| 隆德县| 乃东县| 高阳县|