在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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
@RequiredArgsConstructor如何實現構造器注入
這篇文章主要介紹了@RequiredArgsConstructor如何實現構造器注入問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-09-09mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉義的實現
XML 文件在解析時會將五種特殊字符進行轉義,本文主要介紹了mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉義的實現,具有一定的參考價值,感興趣的可以了解一下2023-12-12