在Spring Boot中集成RabbitMQ詳細(xì)步驟(最新推薦)
如何在Spring Boot中集成RabbitMQ
在現(xiàn)代微服務(wù)架構(gòu)中,消息隊(duì)列(如RabbitMQ)扮演了關(guān)鍵的角色,它不僅能夠提供高效的消息傳遞機(jī)制,還能解耦服務(wù)間的通信。本文將介紹如何在Spring Boot項(xiàng)目中集成RabbitMQ,實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者的基本配置。
步驟1:添加Maven依賴
首先,在你的Spring Boot項(xiàng)目的pom.xml中添加spring-boot-starter-amqp依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>這個(gè)starter包含了與RabbitMQ集成所需的所有基本依賴。
步驟2:配置RabbitMQ
在application.yml或application.properties中配置RabbitMQ的連接信息:
spring:
rabbitmq:
host: 10.5.2.27
port: 30700
username: user
password: Sungrow@2023步驟3:實(shí)現(xiàn)生產(chǎn)者
在Spring Boot中,發(fā)送消息到RabbitMQ的生產(chǎn)者可以很簡單地通過RabbitTemplate實(shí)現(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ā)送消息到指定的交換機(jī)和路由鍵。
步驟4:配置RabbitMQ交換機(jī)、隊(duì)列和綁定
在Spring Boot中,可以通過配置類來定義交換機(jī)、隊(duì)列和它們之間的綁定關(guān)系:
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
// 定義交換機(jī)、隊(duì)列、路由鍵等常量
// ...
@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);
}
// 其他隊(duì)列和綁定的定義
// ...
}這段代碼定義了隊(duì)列、交換機(jī),并將它們通過路由鍵綁定起來。
有了配置后,啟動(dòng)服務(wù),可以在rabbitmq控制臺(tái)看到該交換機(jī),隊(duì)列以及他們之間的綁定

點(diǎn)進(jìn)去后可以看到綁定的隊(duì)列,


如果點(diǎn)進(jìn)來,沒有顯示這個(gè)綁定隊(duì)列,就說明配置的不對(duì),后續(xù)也無法消費(fèi),點(diǎn)進(jìn)隊(duì)列后,就會(huì)顯示隊(duì)列中的消息了

步驟5:實(shí)現(xiàn)消費(fèi)者
消費(fèi)者用于處理接收到的消息。使用@RabbitListener注解可以很容易地實(shí)現(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) {
// 處理接收到的消息
// ...
}
// 其他消費(fèi)者方法
// ...
}這里,@RabbitListener注解定義了消息的監(jiān)聽和處理邏輯。
步驟6:處理死信隊(duì)列
配置死信隊(duì)列:
@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中,死信隊(duì)列(Dead Letter Queue, DLQ)用于存儲(chǔ)無法正常處理的消息。消息可能由于幾種原因被發(fā)送到死信隊(duì)列,包括:
消息被拒絕(Basic.Reject/Basic.Nack):當(dāng)消費(fèi)者明確拒絕消息且不重新排隊(duì)時(shí)(通過設(shè)置requeue為false),消息會(huì)進(jìn)入死信隊(duì)列。
消息過期:如果消息在隊(duì)列中存活時(shí)間超過設(shè)定的TTL(Time-To-Live),它會(huì)被自動(dòng)發(fā)送到死信隊(duì)列。
隊(duì)列達(dá)到最大長度:如果隊(duì)列設(shè)置了最大長度并達(dá)到這個(gè)限制,最老的消息可能會(huì)被移動(dòng)到死信隊(duì)列。
在Spring Boot集成的RabbitMQ應(yīng)用中,通常會(huì)在消費(fèi)者處理消息時(shí)發(fā)生異常的情況下,明確地將消息發(fā)送到死信隊(duì)列。例如:
@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) {
// 處理消息失敗,拒絕消息并不重新排隊(duì)
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
// 將消息發(fā)送到死信隊(duì)列
rabbitTemplate.convertAndSend(RabbitMQConfig.DEAD_EXCHANGE_A, RabbitMQConfig.DEAD_ROUTING_KEY_A, message);
}
}在這個(gè)例子中,如果在處理消息的過程中發(fā)生異常,消息會(huì)被明確地拒絕,并發(fā)送到配置的死信隊(duì)列。
為什么使用死信隊(duì)列
避免消息丟失:死信隊(duì)列確保無法處理的消息不會(huì)被丟失,而是存儲(chǔ)在一個(gè)特定的地方,供進(jìn)一步的檢查和處理。
分析和調(diào)試:可以對(duì)死信隊(duì)列中的消息進(jìn)行分析,以確定為什么消息不能被正常處理。
避免重復(fù)處理無效消息:通過將無法處理的消息移動(dòng)到死信隊(duì)列,防止消費(fèi)者重復(fù)嘗試處理同一消息,這可能導(dǎo)致無限循環(huán)。
死信隊(duì)列(DLQ)用于處理無法正常消費(fèi)的消息。配置死信隊(duì)列類似于配置普通隊(duì)列,但需要一些額外的參數(shù),如TTL(Time-To-Live)和死信交換機(jī)
到此這篇關(guān)于教你如何在Spring Boot中集成RabbitMQ的文章就介紹到這了,更多相關(guān)Spring Boot集成RabbitMQ內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud Zuul實(shí)現(xiàn)負(fù)載均衡和熔斷機(jī)制方式
這篇文章主要介紹了SpringCloud Zuul實(shí)現(xiàn)負(fù)載均衡和熔斷機(jī)制方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2021-07-07
@RequiredArgsConstructor如何實(shí)現(xiàn)構(gòu)造器注入
這篇文章主要介紹了@RequiredArgsConstructor如何實(shí)現(xiàn)構(gòu)造器注入問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09
mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉(zhuǎn)義的實(shí)現(xiàn)
XML 文件在解析時(shí)會(huì)將五種特殊字符進(jìn)行轉(zhuǎn)義,本文主要介紹了mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉(zhuǎn)義的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
Java switch 語句如何使用 String 參數(shù)
這篇文章主要介紹了Java switch 語句如何使用 String 參數(shù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06
Java實(shí)現(xiàn)PDF轉(zhuǎn)為Word文檔的示例代碼
眾所周知,PDF文檔除了具有較強(qiáng)穩(wěn)定性和兼容性外,?還具有較強(qiáng)的安全性,在工作中可以有效避免別人無意中對(duì)文檔內(nèi)容進(jìn)行修改。本文將分為以下兩部分介紹如何在保持布局的情況下將PDF轉(zhuǎn)為Word文檔,希望對(duì)大家有所幫助2023-01-01
SpringCloud消息總線Bus配置中心實(shí)現(xiàn)過程解析
這篇文章主要介紹了SpringCloud消息總線Bus配置中心實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
解析Java的JNI編程中的對(duì)象引用與內(nèi)存泄漏問題
這篇文章主要介紹了Java的JNI編程中的對(duì)象引用與內(nèi)存泄漏問題,重點(diǎn)講述了局部和全局引用時(shí)一些值得注意的地方,需要的朋友可以參考下2015-11-11

