在Spring Boot中集成RabbitMQ的實(shí)戰(zhàn)記錄
前言
在現(xiàn)代微服務(wù)架構(gòu)中,消息隊(duì)列(Message Queue)是實(shí)現(xiàn)異步通信、解耦系統(tǒng)組件的重要工具。RabbitMQ 是一個(gè)流行的消息中間件,支持多種消息協(xié)議,具有高可靠性和可擴(kuò)展性。
本博客將詳細(xì)介紹如何在 Spring Boot 項(xiàng)目中集成 RabbitMQ,包括配置、發(fā)送和接收消息的基本流程,并介紹如何通過 兩種方式定義交換機(jī)(Exchange)與隊(duì)列(Queue):一種是在生產(chǎn)者端手動(dòng)聲明,另一種是在消費(fèi)者端通過注解自動(dòng)綁定。
準(zhǔn)備工作
1. 安裝 RabbitMQ
可以通過 Docker 快速安裝 RabbitMQ:
docker run -d --hostname my-rabbit --name rabbitmq \ -p 5672:5672 -p 15672:15672 \ rabbitmq:3-management
5672:AMQP 協(xié)議端口15672:RabbitMQ 管理界面端口
訪問管理界面:http://localhost:15672
默認(rèn)賬號(hào)密碼:guest / guest
2. 消息發(fā)送者(Producer)配置
1. 創(chuàng)建 Spring Boot 項(xiàng)目
使用 Spring Initializr 或 IDE 的新建項(xiàng)目向?qū)韯?chuàng)建一個(gè)新的 Spring Boot 項(xiàng)目,確保添加以下依賴:
- Spring Web
- Spring AMQP
2. 配置 RabbitMQ 連接信息
在 application.yml 中配置 RabbitMQ 的連接參數(shù):
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest3. 編寫消息發(fā)送邏輯
創(chuàng)建一個(gè)簡單的 REST 控制器來觸發(fā)消息發(fā)送:
@RestController
@RequestMapping("/api/producer")
public class ProducerController {
@Autowired
private AmqpTemplate amqpTemplate;
@GetMapping("/send")
public String sendMessage(@RequestParam String message) {
amqpTemplate.convertAndSend("my.queue", message);
return "Message sent: " + message;
}
}? 注意:這種方式適用于直接發(fā)送到隊(duì)列的情況,但在實(shí)際項(xiàng)目中我們通常會(huì)通過 Exchange 來路由消息。
3. 使用 Exchange 的兩種方式
在 RabbitMQ 中,消息的流向是:Producer → Exchange → Queue → Consumer。因此,定義 Exchange 和 Queue 并進(jìn)行綁定是非常關(guān)鍵的步驟。
下面介紹兩種常見的定義方式:
方式一:在生產(chǎn)者端手動(dòng)聲明 Exchange、Queue 和 Binding
示例:Direct Exchange
1. 配置類定義 Exchange、Queue 及其綁定關(guān)系
@Configuration
public class RabbitMQConfig {
@Bean
public DirectExchange myDirectExchange() {
return new DirectExchange("my.direct.exchange");
}
@Bean
public Queue myDirectQueue() {
return new Queue("my.direct.queue");
}
@Bean
public Binding bindingDirectQueueToExchange(Queue myDirectQueue, DirectExchange myDirectExchange) {
return BindingBuilderSupport.bind(myDirectQueue).to(myDirectExchange).with("direct.key").noargs();
}
}2. 發(fā)送消息時(shí)指定 Exchange 和 Routing Key
amqpTemplate.convertAndSend("my.direct.exchange", "direct.key", message);這種方式適合需要精細(xì)控制隊(duì)列和交換機(jī)的場景,如多服務(wù)協(xié)同、復(fù)雜路由等。
方式二:在消費(fèi)者端通過注解自動(dòng)聲明 Exchange、Queue 并綁定
Spring 提供了強(qiáng)大的注解功能,可以在消費(fèi)者監(jiān)聽方法上直接聲明 Exchange、Queue 和綁定關(guān)系,無需額外的配置類。
示例:使用 @RabbitListener 注解綁定
@Component
public class ConsumerListener {
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "my.annotation.queue", durable = "true"),
exchange = @Exchange(value = "my.annotation.exchange", type = "direct", durable = "true"),
key = "annotation.key"
))
public void receive(String message) {
System.out.println("【消費(fèi)者】收到消息:" + message);
}
}優(yōu)點(diǎn):開發(fā)更高效,特別適合快速搭建原型或小型項(xiàng)目。
注意事項(xiàng):
- 此方式只在消費(fèi)者端有效;
- 如果已有 Exchange 或 Queue 與注解配置不一致,可能會(huì)拋出異常;
- 建議設(shè)置
durable = "true"實(shí)現(xiàn)持久化。
4. 消息消費(fèi)者(Consumer)配置
1. 創(chuàng)建 Spring Boot 項(xiàng)目
同樣地,創(chuàng)建一個(gè)新的 Spring Boot 項(xiàng)目,這次只需要添加 Spring AMQP 依賴。
2. 配置 RabbitMQ 連接信息
與生產(chǎn)者的配置相同,在 application.yml 中配置 RabbitMQ 的連接參數(shù)。
3. 創(chuàng)建隊(duì)列并編寫消息接收邏輯
方法一:手動(dòng)定義隊(duì)列(推薦用于簡單場景)
@Configuration
public class RabbitMQConfig {
@Bean
public Queue myQueue() {
return new Queue("my.queue");
}
}方法二:使用 @RabbitListener 自動(dòng)綁定(詳見上文)
消息監(jiān)聽器
@Component
public class ConsumerListener {
@RabbitListener(queues = "my.queue")
public void receive(String message) {
System.out.println("Received message: " + message);
}
}注意事項(xiàng)
- 隊(duì)列名稱一致性:確保生產(chǎn)者和消費(fèi)者的隊(duì)列名稱一致,這樣它們才能正確通信。
- 網(wǎng)絡(luò)連通性:如果生產(chǎn)者和消費(fèi)者運(yùn)行在不同的機(jī)器上,請(qǐng)確保這些機(jī)器之間能夠通過網(wǎng)絡(luò)訪問 RabbitMQ 服務(wù)器,并根據(jù)需要調(diào)整主機(jī)名或 IP 地址。
- 并發(fā)處理:考慮在消費(fèi)者端配置并發(fā)消費(fèi)者以提高消息處理效率。
- 冪等性與容錯(cuò)機(jī)制:建議開啟確認(rèn)機(jī)制(ACK/NACK),避免消息丟失或重復(fù)消費(fèi)。
總結(jié)
通過以上步驟,我們就可以擁有兩個(gè)獨(dú)立的 Spring Boot 應(yīng)用程序:一個(gè)用于發(fā)送消息,另一個(gè)用于消費(fèi)消息。這種方式非常適合構(gòu)建基于消息隊(duì)列的分布式系統(tǒng)。
同時(shí),也了解了兩種定義 Exchange、Queue 及其綁定關(guān)系 的方式:
| 方式 | 適用場景 | 特點(diǎn) |
|---|---|---|
| 生產(chǎn)者手動(dòng)聲明 | 多服務(wù)協(xié)作、復(fù)雜路由 | 控制精細(xì),結(jié)構(gòu)清晰 |
| 消費(fèi)者注解綁定 | 快速開發(fā)、輕量級(jí)項(xiàng)目 | 開發(fā)效率高,但僅限于消費(fèi)者端 |
到此這篇關(guān)于在Spring Boot中集成RabbitMQ的完整指南的文章就介紹到這了,更多相關(guān)Spring Boot集成RabbitMQ內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Springboot配置excludePathPatterns不生效的問題
這篇文章主要介紹了解決Springboot配置excludePathPatterns不生效的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
解決Spring運(yùn)行時(shí)報(bào)錯(cuò):Consider defining a bean o
該文章主要講述了在使用Spring框架時(shí),如果遇到某個(gè)bean未找到的錯(cuò)誤,應(yīng)該在配置文件中定義該bean,解決方法是在對(duì)應(yīng)的類上添加@Component注解2025-01-01
淺談Java中GuavaCache返回Null的注意事項(xiàng)
Guava在實(shí)際的Java后端項(xiàng)目中應(yīng)用的場景還是比較多的,比如限流,緩存,容器操作之類的,本文主要介紹了GuavaCache返回Null的注意事項(xiàng),感興趣的可以了解一下2021-10-10
Java?easyExcel的復(fù)雜表頭多級(jí)表頭導(dǎo)入
最近在項(xiàng)目開發(fā)中遇到的一個(gè)excel復(fù)雜表頭的導(dǎo)入數(shù)據(jù)庫操作,下面這篇文章主要給大家介紹了關(guān)于Java?easyExcel的復(fù)雜表頭多級(jí)表頭導(dǎo)入的相關(guān)資料,需要的朋友可以參考下2022-06-06
FilenameUtils.getName?函數(shù)源碼分析
這篇文章主要為大家介紹了FilenameUtils.getName?函數(shù)源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
詳解Java MyBatis 插入數(shù)據(jù)庫返回主鍵
這篇文章主要介紹了詳解Java MyBatis 插入數(shù)據(jù)庫返回主鍵,有興趣的可以了解一下。2017-01-01

