亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在Spring Boot中集成RabbitMQ詳細步驟(最新推薦)

 更新時間:2023年12月08日 12:07:42   作者:chenkangck50  
本文將介紹如何在Spring Boot項目中集成RabbitMQ,實現生產者和消費者的基本配置,本文分步驟給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

如何在Spring Boot中集成RabbitMQ

在現代微服務架構中,消息隊列(如RabbitMQ)扮演了關鍵的角色,它不僅能夠提供高效的消息傳遞機制,還能解耦服務間的通信。本文將介紹如何在Spring Boot項目中集成RabbitMQ,實現生產者和消費者的基本配置。

步驟1:添加Maven依賴

首先,在你的Spring Boot項目的pom.xml中添加spring-boot-starter-amqp依賴:

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

這個starter包含了與RabbitMQ集成所需的所有基本依賴。

步驟2:配置RabbitMQ

在application.yml或application.properties中配置RabbitMQ的連接信息:

spring:
  rabbitmq:
    host: 10.5.2.27
    port: 30700
    username: user
    password: Sungrow@2023

步驟3:實現生產者

在Spring Boot中,發(fā)送消息到RabbitMQ的生產者可以很簡單地通過RabbitTemplate實現:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.*;
import com.alibaba.fastjson.JSONObject;
@RestController
@RequestMapping("/menu")
public class MenuController {
    @Resource
    private RabbitTemplate rabbitTemplate;
    @PostMapping("/add")
    public Result<SysPermission> add(@RequestBody SysPermission permission) {
        // ... 添加菜單的業(yè)務邏輯
        rabbitTemplate.convertAndSend(RabbitConstant.GOODS_EXCHANGE, RabbitConstant.MENU_MESSAGE, JSONObject.toJSONString(permission));
        return new Result<SysPermission>().success("添加成功!");
    }
}

這里,convertAndSend方法用于發(fā)送消息到指定的交換機和路由鍵。

步驟4:配置RabbitMQ交換機、隊列和綁定

在Spring Boot中,可以通過配置類來定義交換機、隊列和它們之間的綁定關系:

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
    // 定義交換機、隊列、路由鍵等常量
    // ... 
    @Bean
    public Queue queueA() {
        return new Queue(GOODS_QUEUE_A, true);
    }
    @Bean
    TopicExchange myExchange() {
        return new TopicExchange(GOODS_EXCHANGE);
    }
    @Bean
    Binding bindingA(Queue queueA, TopicExchange exchange) {
        return BindingBuilder.bind(queueA).to(exchange).with(GOODS_APP_ROUTING);
    }
    // 其他隊列和綁定的定義
    // ...
}

這段代碼定義了隊列、交換機,并將它們通過路由鍵綁定起來。
有了配置后,啟動服務,可以在rabbitmq控制臺看到該交換機,隊列以及他們之間的綁定

點進去后可以看到綁定的隊列,

如果點進來,沒有顯示這個綁定隊列,就說明配置的不對,后續(xù)也無法消費,點進隊列后,就會顯示隊列中的消息了

步驟5:實現消費者

消費者用于處理接收到的消息。使用@RabbitListener注解可以很容易地實現:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
@Component
public class MessageReceiver {
    @RabbitListener(bindings = @QueueBinding(
        value = @Queue(name = RabbitMQConfig.GOODS_QUEUE_A),
        exchange = @Exchange(name = RabbitMQConfig.GOODS_EXCHANGE, type = ExchangeTypes.TOPIC),
        key = RabbitMQConfig.GOODS_APP_ROUTING
    ))
    public void receiveAppMessage(Message message, Channel channel) {
        // 處理接收到的消息
        // ...
    }
    // 其他消費者方法
    // ...
}

這里,@RabbitListener注解定義了消息的監(jiān)聽和處理邏輯。

步驟6:處理死信隊列

配置死信隊列:

@Bean
public Queue deadQueue() {
    Map<String, Object> args = new HashMap<>();
    args.put("x-dead-letter-exchange", DEAD_EXCHANGE_A);
    args.put("x-dead-letter-routing-key", DEAD_ROUTING_KEY_A);
    return new Queue(DEAD_QUEUE_A, true, false, false, args);
}
@Bean
DirectExchange deadExchange() {
    return new DirectExchange(DEAD_EXCHANGE_A, true, false);
}
@Bean
Binding bindingDead(Queue deadQueue, DirectExchange deadExchange) {
    return BindingBuilder.bind(deadQueue).to(deadExchange).with(DEAD_ROUTING_KEY_A);
}

在RabbitMQ中,死信隊列(Dead Letter Queue, DLQ)用于存儲無法正常處理的消息。消息可能由于幾種原因被發(fā)送到死信隊列,包括:

消息被拒絕(Basic.Reject/Basic.Nack):當消費者明確拒絕消息且不重新排隊時(通過設置requeue為false),消息會進入死信隊列。

消息過期:如果消息在隊列中存活時間超過設定的TTL(Time-To-Live),它會被自動發(fā)送到死信隊列。

隊列達到最大長度:如果隊列設置了最大長度并達到這個限制,最老的消息可能會被移動到死信隊列。

在Spring Boot集成的RabbitMQ應用中,通常會在消費者處理消息時發(fā)生異常的情況下,明確地將消息發(fā)送到死信隊列。例如:

 
@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = RabbitMQConfig.GOODS_QUEUE_A),
    exchange = @Exchange(name = RabbitMQConfig.GOODS_EXCHANGE, type = ExchangeTypes.TOPIC),
    key = RabbitMQConfig.GOODS_APP_ROUTING
))
public void receiveAppMessage(Message message, Channel channel) throws IOException {
    try {
        // 處理消息
    } catch (Exception e) {
        // 處理消息失敗,拒絕消息并不重新排隊
        channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
        // 將消息發(fā)送到死信隊列
        rabbitTemplate.convertAndSend(RabbitMQConfig.DEAD_EXCHANGE_A, RabbitMQConfig.DEAD_ROUTING_KEY_A, message);
    }
}

在這個例子中,如果在處理消息的過程中發(fā)生異常,消息會被明確地拒絕,并發(fā)送到配置的死信隊列。

為什么使用死信隊列
避免消息丟失:死信隊列確保無法處理的消息不會被丟失,而是存儲在一個特定的地方,供進一步的檢查和處理。
分析和調試:可以對死信隊列中的消息進行分析,以確定為什么消息不能被正常處理。
避免重復處理無效消息:通過將無法處理的消息移動到死信隊列,防止消費者重復嘗試處理同一消息,這可能導致無限循環(huán)。
死信隊列(DLQ)用于處理無法正常消費的消息。配置死信隊列類似于配置普通隊列,但需要一些額外的參數,如TTL(Time-To-Live)和死信交換機

到此這篇關于教你如何在Spring Boot中集成RabbitMQ的文章就介紹到這了,更多相關Spring Boot集成RabbitMQ內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java實現背單詞程序

    java實現背單詞程序

    這篇文章主要為大家詳細介紹了java實現背單詞程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • SpringCloud Zuul實現負載均衡和熔斷機制方式

    SpringCloud Zuul實現負載均衡和熔斷機制方式

    這篇文章主要介紹了SpringCloud Zuul實現負載均衡和熔斷機制方式,具有很好的參考價值,希望對大家有所幫助。
    2021-07-07
  • @RequiredArgsConstructor如何實現構造器注入

    @RequiredArgsConstructor如何實現構造器注入

    這篇文章主要介紹了@RequiredArgsConstructor如何實現構造器注入問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉義的實現

    mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉義的實現

    XML 文件在解析時會將五種特殊字符進行轉義,本文主要介紹了mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉義的實現,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Java switch 語句如何使用 String 參數

    Java switch 語句如何使用 String 參數

    這篇文章主要介紹了Java switch 語句如何使用 String 參數,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下
    2019-06-06
  • Java高版本Api在Android中的使用方法詳解

    Java高版本Api在Android中的使用方法詳解

    API(Application?Programming?Interface)應用程序編程接口,java?API是一本程序員字典,是JDK提供給我們使用的類的說明文檔,下面這篇文章主要給大家介紹了關于Java高版本Api在Android中的使用方法,需要的朋友可以參考下
    2022-05-05
  • Java實現PDF轉為Word文檔的示例代碼

    Java實現PDF轉為Word文檔的示例代碼

    眾所周知,PDF文檔除了具有較強穩(wěn)定性和兼容性外,?還具有較強的安全性,在工作中可以有效避免別人無意中對文檔內容進行修改。本文將分為以下兩部分介紹如何在保持布局的情況下將PDF轉為Word文檔,希望對大家有所幫助
    2023-01-01
  • SpringCloud消息總線Bus配置中心實現過程解析

    SpringCloud消息總線Bus配置中心實現過程解析

    這篇文章主要介紹了SpringCloud消息總線Bus配置中心實現過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • 解析Java的JNI編程中的對象引用與內存泄漏問題

    解析Java的JNI編程中的對象引用與內存泄漏問題

    這篇文章主要介紹了Java的JNI編程中的對象引用與內存泄漏問題,重點講述了局部和全局引用時一些值得注意的地方,需要的朋友可以參考下
    2015-11-11
  • 關于BigDecimal類型之間比較問題

    關于BigDecimal類型之間比較問題

    這篇文章主要介紹了關于BigDecimal類型之間比較問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評論