Spring Boot 整合 RabbitMQ從入門到實(shí)戰(zhàn)步驟
在分布式系統(tǒng)開發(fā)中,消息隊列是解耦服務(wù)、提升可靠性的關(guān)鍵組件。RabbitMQ 作為業(yè)界廣泛使用的消息中間件,與 Spring Boot 的整合能顯著提升開發(fā)效率。本文將手把手教你完成 Spring Boot 與 RabbitMQ 的整合,涵蓋基礎(chǔ)配置、消息發(fā)送與接收,以及高級特性如手動確認(rèn)和消息確認(rèn)機(jī)制。
1.環(huán)境準(zhǔn)備
確保已安裝 JDK 1.8+、Maven 3.0+ 和 RabbitMQ 服務(wù)。RabbitMQ 可通過 Docker 快速啟動:
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management
2.創(chuàng)建 Spring Boot 項目
使用 Spring Initializr 創(chuàng)建項目,添加以下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>3.配置 RabbitMQ 連接
在 src/main/resources/application.yml中配置連接參數(shù):
spring:
rabbitmq:
host: localhost # RabbitMQ 服務(wù)器地址
port: 5672 # 默認(rèn)端口
username: guest # 默認(rèn)用戶名
password: guest # 默認(rèn)密碼
virtual-host: / # 虛擬主機(jī)(默認(rèn))
publisher-confirm-type: correlated # 開啟消息確認(rèn)
publisher-returns: true # 開啟消息失敗回調(diào)
listener:
simple:
acknowledge-mode: manual # 手動確認(rèn)消息
prefetch: 1 # 每次預(yù)取的消息數(shù)4.聲明隊列和交換機(jī)
創(chuàng)建配置類定義隊列、交換機(jī)及綁定關(guān)系:
@Configuration
public class RabbitConfig {
// 直連交換機(jī)
public static final String DIRECT_EXCHANGE = "direct_exchange";
// 隊列
public static final String DIRECT_QUEUE = "direct_queue";
// 路由鍵
public static final String ROUTING_KEY = "routing_key";
@Bean
public Exchange directExchange() {
return ExchangeBuilder.directExchange(DIRECT_EXCHANGE).build();
}
@Bean
public Queue directQueue() {
return new Queue(DIRECT_QUEUE, true); // durable=true 表示持久化
}
@Bean
public Binding binding(Queue queue, Exchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
}
}5.生產(chǎn)者(發(fā)送消息)
創(chuàng)建 RabbitProducer.java 注入 RabbitTemplate 發(fā)送消息:
@Service
public class RabbitProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage(String message) {
rabbitTemplate.convertAndSend(
RabbitConfig.DIRECT_EXCHANGE,
RabbitConfig.ROUTING_KEY,
message
);
}
}6.消費(fèi)者(接收消息)
創(chuàng)建 RabbitConsumer.java 監(jiān)聽隊列:
@Service
public class RabbitConsumer {
@RabbitListener(queues = RabbitConfig.DIRECT_QUEUE)
public void receiveMessage(String message) {
System.out.println("收到消息: " + message);
// 手動確認(rèn)消息(需配置 acknowledge-mode: manual)
// 實(shí)際項目中需處理異常和重試邏輯
}
}7.消息確認(rèn)機(jī)制
生產(chǎn)者確認(rèn)
在 application.yml 中已配置 publisher-confirm-type: correlated,可通過回調(diào)確認(rèn)消息是否成功到達(dá)交換機(jī):
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setConfirmCallback((correlationData, ack, cause) -> {
if (ack) {
System.out.println("消息確認(rèn)成功");
} else {
System.err.println("消息確認(rèn)失敗: " + cause);
}
});
template.setMandatory(true); // 開啟強(qiáng)制回調(diào)
return template;
}消費(fèi)者確認(rèn):配置 acknowledge-mode: manual 后,需在消費(fèi)者中手動確認(rèn):
@RabbitListener(queues = RabbitConfig.DIRECT_QUEUE)
public void receiveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {
try {
System.out.println("處理消息: " + message);
channel.basicAck(deliveryTag, false); // 確認(rèn)消息
} catch (Exception e) {
channel.basicNack(deliveryTag, false, true); // 拒絕消息并重新入隊
}
}
8.死信隊列配置
處理無法被消費(fèi)的消息,創(chuàng)建死信隊列并綁定:
@Bean
public Queue deadLetterQueue() {
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", "dlx_exchange"); // 指定死信交換機(jī)
args.put("x-dead-letter-routing-key", "dlx_routing_key");
return new Queue("dlx_queue", true, false, false, args);
}
9.測試與驗證
確保 RabbitMQ 服務(wù)已啟動(默認(rèn)端口 15672 為管理界面)。
創(chuàng)建 RabbitMQApplicationTests.java:
@SpringBootTest
@AutoConfigureMockMvc
public class RabbitMQApplicationTests {
@Autowired
private RabbitProducer producer;
@Test
public void testSendMessage() {
producer.sendMessage("Hello RabbitMQ!");
}
}10.常見問題與解決方案
連接失敗:檢查 host 和 port 是否正確,確保 RabbitMQ 服務(wù)已啟動。
消息未消費(fèi):確認(rèn)消費(fèi)者監(jiān)聽的是正確的隊列,檢查 acknowledge-mode 配置。
性能調(diào)優(yōu):調(diào)整 prefetch-count 和 concurrency 參數(shù)優(yōu)化吞吐量。
11.總結(jié)
本文從零開始實(shí)現(xiàn)了 Spring Boot 與 RabbitMQ 的整合,涵蓋基礎(chǔ)配置、消息發(fā)送與接收、高級特性(如手動確認(rèn)和死信隊列)。通過合理使用這些特性,可以構(gòu)建高可靠、高性能的分布式系統(tǒng)。如需進(jìn)一步學(xué)習(xí),可參考 RabbitMQ 官方文檔。
到此這篇關(guān)于Spring Boot 整合 RabbitMQ從入門到實(shí)戰(zhàn)步驟的文章就介紹到這了,更多相關(guān)Spring Boot 整合 RabbitMQ內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot整合rabbitmq實(shí)現(xiàn)訂單超時取消案例分析
- SpringBoot整合Canal+RabbitMQ監(jiān)聽數(shù)據(jù)變更詳解
- SpringBoot 整合 RabbitMQ 的使用方式(代碼示例)
- SpringBoot整合RabbitMQ實(shí)現(xiàn)延遲隊列和死信隊列
- SpringBoot整合RabbitMQ的5種模式的注解綁定詳解
- Springboot整合RabbitMQ消息中間件的使用
- springboot rabbitmq整合rabbitmq之消息持久化存儲問題
- SpringBoot整合RabbitMQ示例詳解
- SpringBoot整合RabbitMQ及原理
相關(guān)文章
Token登陸驗證機(jī)制的原理及實(shí)現(xiàn)
這篇文章介紹了Token登陸驗證機(jī)制的原理及實(shí)現(xiàn),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12
Java 改造ayui表格組件實(shí)現(xiàn)多重排序
layui 的表格組件目前只支持單列排序,在實(shí)際應(yīng)用中并不能很好的支撐我們的業(yè)務(wù)需求。今天一時手癢,決定改造一番以支持多重排序。2021-04-04
寧可用Lombok也不把成員設(shè)置為public原理解析
這篇文章主要為大家介紹了寧可用Lombok也不把成員設(shè)置為public原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Springboot整合Java?DL4J實(shí)現(xiàn)交通標(biāo)志識別系統(tǒng)全過程
在自動駕駛系統(tǒng)中,交通標(biāo)志識別是實(shí)現(xiàn)車輛智能化的關(guān)鍵技術(shù)之一,本文介紹了利用SpringBoot和JavaDeeplearning4j構(gòu)建交通標(biāo)志識別系統(tǒng)的方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10
解決在Idea 2020.2下使用 Lombok的注解不生效的問題(插件安裝了,依賴也寫了,自動注解也設(shè)置了)
這篇文章主要介紹了在Idea 2020.2下使用 Lombok的注解不生效的問題(插件安裝了,依賴也寫了,自動注解也設(shè)置了),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
JDK10新特性之var泛型和多個接口實(shí)現(xiàn)方法
這篇文章主要介紹了JDK10的新特性:var泛型和多個接口實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05

