在Spring Boot中集成RabbitMQ詳細步驟(最新推薦)
如何在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)文章
SpringCloud Zuul實現(xiàn)負載均衡和熔斷機制方式
這篇文章主要介紹了SpringCloud Zuul實現(xiàn)負載均衡和熔斷機制方式,具有很好的參考價值,希望對大家有所幫助。2021-07-07@RequiredArgsConstructor如何實現(xiàn)構(gòu)造器注入
這篇文章主要介紹了@RequiredArgsConstructor如何實現(xiàn)構(gòu)造器注入問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-09-09mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉(zhuǎn)義的實現(xiàn)
XML 文件在解析時會將五種特殊字符進行轉(zhuǎn)義,本文主要介紹了mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉(zhuǎn)義的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-12-12Java switch 語句如何使用 String 參數(shù)
這篇文章主要介紹了Java switch 語句如何使用 String 參數(shù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下2019-06-06Java實現(xiàn)PDF轉(zhuǎn)為Word文檔的示例代碼
眾所周知,PDF文檔除了具有較強穩(wěn)定性和兼容性外,?還具有較強的安全性,在工作中可以有效避免別人無意中對文檔內(nèi)容進行修改。本文將分為以下兩部分介紹如何在保持布局的情況下將PDF轉(zhuǎn)為Word文檔,希望對大家有所幫助2023-01-01SpringCloud消息總線Bus配置中心實現(xiàn)過程解析
這篇文章主要介紹了SpringCloud消息總線Bus配置中心實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03解析Java的JNI編程中的對象引用與內(nèi)存泄漏問題
這篇文章主要介紹了Java的JNI編程中的對象引用與內(nèi)存泄漏問題,重點講述了局部和全局引用時一些值得注意的地方,需要的朋友可以參考下2015-11-11