欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

如何在Spring Boot中集成RabbitMQ

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

步驟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:實現(xiàn)生產(chǎn)者

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

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è)務(wù)邏輯
        rabbitTemplate.convertAndSend(RabbitConstant.GOODS_EXCHANGE, RabbitConstant.MENU_MESSAGE, JSONObject.toJSONString(permission));
        return new Result<SysPermission>().success("添加成功!");
    }
}

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

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

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

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);
    }
    // 其他隊列和綁定的定義
    // ...
}

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

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

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

步驟5:實現(xiàn)消費者

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

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):當(dāng)消費者明確拒絕消息且不重新排隊時(通過設(shè)置requeue為false),消息會進入死信隊列。

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

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

在Spring Boot集成的RabbitMQ應(yīng)用中,通常會在消費者處理消息時發(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ā)送到配置的死信隊列。

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

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

相關(guān)文章

最新評論