Spring Boot 4.0 牽手RabbitMQ注解魔法開啟消息之旅
一、RabbitMQ 與 Spring Boot 4.0,為何是絕配?
在當(dāng)今分布式系統(tǒng)盛行的時(shí)代,高效的消息通信與系統(tǒng)間的解耦變得至關(guān)重要。RabbitMQ 作為一款備受歡迎的消息隊(duì)列中間件,以其強(qiáng)大的異步通信能力和出色的解耦特性脫穎而出。它就像是分布式系統(tǒng)中的 “信使”,在各個(gè)服務(wù)之間傳遞消息,讓不同的服務(wù)能夠異步地進(jìn)行交互,避免了服務(wù)之間的直接依賴,大大降低了系統(tǒng)的耦合度。
舉個(gè)例子,在一個(gè)電商系統(tǒng)中,訂單服務(wù)創(chuàng)建訂單后,無需立即同步調(diào)用庫存服務(wù)和通知服務(wù),而是將消息發(fā)送到 RabbitMQ。庫存服務(wù)和通知服務(wù)可以按照自己的節(jié)奏從隊(duì)列中獲取消息并處理,這樣不僅提高了系統(tǒng)的響應(yīng)速度,還增強(qiáng)了系統(tǒng)的穩(wěn)定性和擴(kuò)展性。
而 Spring Boot 4.0 的發(fā)布,更是為開發(fā)者帶來了一系列令人興奮的新特性。它基于 Spring Framework 7.0 構(gòu)建,在性能、開發(fā)體驗(yàn)和云原生適配等方面都有了顯著的提升。例如,它對虛擬線程的支持,使得應(yīng)用能夠輕松應(yīng)對高并發(fā)場景,極大地提高了系統(tǒng)的吞吐量;新的 API 和注解也讓開發(fā)變得更加簡潔高效。
當(dāng)強(qiáng)大的 RabbitMQ 遇上全新升級的 Spring Boot 4.0,兩者的結(jié)合就像是天作之合。Spring Boot 4.0 提供的便捷配置和強(qiáng)大的依賴管理,使得集成 RabbitMQ 變得輕而易舉;而 RabbitMQ 則為 Spring Boot 應(yīng)用帶來了可靠的異步消息通信能力。在這其中,使用注解方式進(jìn)行整合更是讓開發(fā)過程如虎添翼,極大地提高了開發(fā)效率。接下來,就讓我們一起深入探索 Spring Boot 4.0 整合 RabbitMQ 的注解方式使用指南。
二、環(huán)境搭建:準(zhǔn)備就緒,開啟整合
(一)創(chuàng)建 Spring Boot 4.0 項(xiàng)目
首先,我們需要?jiǎng)?chuàng)建一個(gè) Spring Boot 4.0 項(xiàng)目。這里,Spring Initializr 為我們提供了極大的便利,它就像是一個(gè)貼心的項(xiàng)目初始化助手,只需簡單幾步操作,就能快速生成一個(gè)基礎(chǔ)的 Spring Boot 項(xiàng)目框架。接下來,讓我們看看具體的操作步驟。
- 打開瀏覽器,訪問 Spring Initializr 的官方地址:https://start.spring.io/。如果在國內(nèi)訪問,你也可以使用鏡像地址https://start.springboot.io/,以解決官方地址加載慢的問題。
- 在打開的頁面中,我們可以看到一系列的項(xiàng)目配置選項(xiàng)。在 “Project Metadata” 部分,填寫項(xiàng)目的基本信息,包括 Group(通常是公司或組織的域名倒置,例如
com.example)、Artifact(項(xiàng)目的名稱,例如spring-boot-rabbitmq-demo)、Name(項(xiàng)目的顯示名稱,默認(rèn)與 Artifact 相同)、Description(項(xiàng)目描述,可簡要介紹項(xiàng)目的用途)以及 Package name(項(xiàng)目的包名,默認(rèn)根據(jù) Group 和 Artifact 生成)。同時(shí),選擇 Maven 項(xiàng)目和 Java 語言,并將 Spring Boot 版本設(shè)置為 4.0.0。 - 點(diǎn)擊 “Add Dependencies” 按鈕,搜索并添加以下依賴:
- Spring for RabbitMQ:這是 Spring Boot 與 RabbitMQ 集成的核心依賴,它提供了一系列的接口和工具類,讓我們能夠方便地在 Spring Boot 項(xiàng)目中使用 RabbitMQ 的各種功能,比如創(chuàng)建隊(duì)列、發(fā)送和接收消息等。
- Spring Web:如果你的項(xiàng)目需要提供 Web 服務(wù),這個(gè)依賴是必不可少的。它包含了 Spring MVC 和 Tomcat 容器,讓我們能夠快速搭建一個(gè) Web 應(yīng)用,方便與外界進(jìn)行交互。
- 配置完成后,點(diǎn)擊 “GENERATE” 按鈕,Spring Initializr 會根據(jù)我們的配置生成一個(gè) ZIP 壓縮包并自動(dòng)下載。解壓這個(gè)壓縮包,我們就得到了一個(gè)完整的 Spring Boot 項(xiàng)目結(jié)構(gòu),其中
pom.xml文件管理著項(xiàng)目的依賴關(guān)系,src/main/java目錄存放著我們的 Java 代碼,src/main/resources目錄則存放著配置文件、靜態(tài)資源等。
(二)安裝與啟動(dòng) RabbitMQ
安裝 RabbitMQ,使用 Docker 是個(gè)高效的方式,它能快速構(gòu)建出一個(gè)運(yùn)行環(huán)境,并且隔離性好,不會對我們的本地系統(tǒng)造成過多的干擾。下面是具體的安裝和啟動(dòng)步驟:
- 確保你的系統(tǒng)已經(jīng)安裝了 Docker。如果沒有安裝,可以參考 Docker 官方文檔進(jìn)行安裝。
- 拉取 RabbitMQ 鏡像,在終端中運(yùn)行以下命令:
docker pull rabbitmq:management
這里使用的rabbitmq:management鏡像,它不僅包含了 RabbitMQ 服務(wù)器,還自帶了 Web 管理插件,通過這個(gè)插件,我們可以在瀏覽器中直觀地管理和監(jiān)控 RabbitMQ 的運(yùn)行狀態(tài),比如查看隊(duì)列中的消息、創(chuàng)建和刪除隊(duì)列等。
3. 拉取鏡像后,通過以下命令啟動(dòng) RabbitMQ 容器:
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management
命令中的參數(shù)解釋如下:
-d:表示以后臺模式運(yùn)行容器,這樣我們在啟動(dòng)容器后,還可以繼續(xù)在終端中執(zhí)行其他命令,而不會被容器的運(yùn)行過程所阻塞。--name rabbitmq:為容器指定一個(gè)名稱為rabbitmq,方便我們后續(xù)對容器進(jìn)行管理和操作,比如停止、重啟容器等。-p 5672:5672:將容器的 5672 端口(RabbitMQ 的默認(rèn)端口,用于應(yīng)用程序與 RabbitMQ 進(jìn)行通信)映射到主機(jī)的 5672 端口,這樣我們的應(yīng)用程序就可以通過主機(jī)的 5672 端口與容器中的 RabbitMQ 進(jìn)行交互。-p 15672:15672:將容器的 15672 端口(RabbitMQ 管理界面的端口)映射到主機(jī)的 15672 端口,這樣我們就可以在瀏覽器中通過訪問http://localhost:15672來打開 RabbitMQ 的管理界面。
- 啟動(dòng)容器后,打開瀏覽器,訪問
http://localhost:15672,在登錄頁面中,默認(rèn)的用戶名和密碼都是guest。登錄后,我們就可以看到 RabbitMQ 的管理界面,在這里,我們可以進(jìn)行各種管理操作,比如創(chuàng)建新的用戶、設(shè)置用戶權(quán)限、創(chuàng)建隊(duì)列和交換機(jī)等。
三、核心配置:搭建橋梁,連接兩者
(一)配置文件詳解
在 Spring Boot 項(xiàng)目中,我們主要在application.yml配置文件中配置 RabbitMQ 的連接參數(shù)。這些參數(shù)就像是連接 Spring Boot 應(yīng)用與 RabbitMQ 服務(wù)器的橋梁,確保兩者能夠順利通信。以下是一些關(guān)鍵配置參數(shù)及其作用:
spring:
rabbitmq:
host: localhost # RabbitMQ服務(wù)器地址
port: 5672 # 端口號
username: guest # 用戶名
password: guest # 密碼
virtual-host: / # 虛擬主機(jī),相當(dāng)于一個(gè)獨(dú)立的消息隔離空間,可以在同一RabbitMQ服務(wù)器上創(chuàng)建多個(gè)虛擬主機(jī),每個(gè)虛擬主機(jī)之間相互隔離,擁有自己的隊(duì)列、交換機(jī)和綁定關(guān)系等。
# 連接池配置 (Spring Boot 3.x 新特性),設(shè)置連接超時(shí)時(shí)間為5秒。連接池可以復(fù)用連接,減少連接創(chuàng)建和銷毀的開銷,提高系統(tǒng)性能。
connection-timeout: 5s
# 發(fā)布確認(rèn),設(shè)置為correlated,表示啟用發(fā)布確認(rèn)機(jī)制,并且使用關(guān)聯(lián)數(shù)據(jù)(CorrelationData)來跟蹤消息的確認(rèn)情況。這樣生產(chǎn)者可以知道消息是否成功發(fā)送到交換機(jī)。
publisher-confirm-type: correlated
publisher-returns: true # 啟用發(fā)布返回,當(dāng)消息發(fā)送到交換機(jī)后,如果無法路由到任何隊(duì)列,會將消息返回給生產(chǎn)者。
template:
mandatory: true # 當(dāng)mandatory為true時(shí),如果消息無法路由到隊(duì)列,會觸發(fā)ReturnCallback,將消息返回給生產(chǎn)者;如果為false,消息會被直接丟棄。
listener:
simple:
acknowledge-mode: manual # 手動(dòng)確認(rèn),設(shè)置為manual表示消費(fèi)者需要手動(dòng)調(diào)用`channel.basicAck`方法來確認(rèn)消息已被成功處理,防止消息丟失。
retry:
enabled: true # 啟用監(jiān)聽重試
max-attempts: 3 # 最大重試次數(shù)
initial-interval: 2s # 初始重試間隔時(shí)間為2秒(二)注解聲明隊(duì)列、交換機(jī)和綁定
在 Spring Boot 中,我們可以通過配置類使用注解來聲明隊(duì)列、交換機(jī)和綁定關(guān)系。以一個(gè)訂單處理的場景為例,假設(shè)我們有一個(gè)訂單隊(duì)列,用于接收訂單消息,同時(shí)還配置了死信隊(duì)列和延遲隊(duì)列,以處理訂單的超時(shí)和重試等情況。下面是具體的配置代碼:
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
// 聲明訂單隊(duì)列,設(shè)置隊(duì)列持久化,并且指定死信交換機(jī)和死信路由鍵,消息10秒過期,隊(duì)列最大長度為1000。
@Bean
public Queue orderQueue() {
return QueueBuilder.durable("order.queue")
.deadLetterExchange("dlx.exchange")
.deadLetterRoutingKey("order.dl")
.ttl(10000) // 10秒過期
.maxLength(1000)
.build();
}
// 聲明死信隊(duì)列,用于接收從訂單隊(duì)列中過期或被拒絕的消息。
@Bean
public Queue dlQueue() {
return QueueBuilder.durable("dl.order.queue")
.build();
}
// 聲明訂單交換機(jī),類型為DirectExchange,并且設(shè)置為持久化。DirectExchange會根據(jù)路由鍵將消息直接路由到對應(yīng)的隊(duì)列。
@Bean
public DirectExchange orderExchange() {
return ExchangeBuilder.directExchange("order.exchange")
.durable(true)
.build();
}
// 聲明死信交換機(jī),同樣是DirectExchange類型且持久化。
@Bean
public DirectExchange dlxExchange() {
return ExchangeBuilder.directExchange("dlx.exchange")
.durable(true)
.build();
}
// 聲明訂單隊(duì)列與訂單交換機(jī)的綁定關(guān)系,指定路由鍵為order.routing.key。
@Bean
public Binding orderBinding(Queue orderQueue, DirectExchange orderExchange) {
return BindingBuilder.bind(orderQueue).to(orderExchange).with("order.routing.key");
}
// 聲明死信隊(duì)列與死信交換機(jī)的綁定關(guān)系,路由鍵為order.dl。
@Bean
public Binding dlBinding(Queue dlQueue, DirectExchange dlxExchange) {
return BindingBuilder.bind(dlQueue).to(dlxExchange).with("order.dl");
}
// 聲明延遲隊(duì)列,使用RabbitMQ延遲消息插件,設(shè)置隊(duì)列持久化,并添加x-delayed-type參數(shù),指定為direct類型。
@Bean
public Queue delayedQueue() {
return QueueBuilder.durable("delayed.queue")
.withArgument("x-delayed-type", "direct")
.build();
}
// 聲明延遲交換機(jī),類型為CustomExchange,并且設(shè)置為持久化,添加x-delayed-type參數(shù),指定為direct類型。
@Bean
public CustomExchange delayedExchange() {
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "direct");
return new CustomExchange("delayed.exchange", "x-delayed-message", true, false, args);
}
}在上述配置中,我們使用了@Bean注解來創(chuàng)建隊(duì)列、交換機(jī)和綁定關(guān)系的 Bean 實(shí)例。通過這種方式,Spring 容器在啟動(dòng)時(shí)會自動(dòng)創(chuàng)建這些組件,并將它們注冊到 RabbitMQ 服務(wù)器上。同時(shí),我們還設(shè)置了隊(duì)列的一些屬性,如持久化、死信相關(guān)配置以及延遲隊(duì)列的特殊參數(shù)等,以滿足不同的業(yè)務(wù)需求 。
四、生產(chǎn)者:消息的源頭
(一)生產(chǎn)者服務(wù)類實(shí)現(xiàn)
在 Spring Boot 中,我們通過RabbitTemplate來發(fā)送消息。RabbitTemplate就像是一個(gè)智能的消息快遞員,它封裝了與 RabbitMQ 交互的細(xì)節(jié),讓我們可以方便地發(fā)送各種類型的消息。接下來,我們創(chuàng)建一個(gè)生產(chǎn)者服務(wù)類,展示如何發(fā)送簡單消息、對象消息、確認(rèn)消息和延遲消息。
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.UUID;
@Service
public class MessageProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private ObjectMapper objectMapper;
/**
* 發(fā)送簡單消息
*/
public void sendSimpleMessage(String message) {
rabbitTemplate.convertAndSend("order.exchange", "order.routing.key", message);
}
/**
* 發(fā)送對象消息
*/
public void sendOrderMessage(Order order) {
rabbitTemplate.convertAndSend("order.exchange", "order.routing.key", order, message -> {
// 設(shè)置消息屬性
message.getMessageProperties().setContentType("application/json");
return message;
});
}
/**
* 發(fā)送確認(rèn)消息
*/
public void sendConfirmMessage(String message) {
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
rabbitTemplate.convertAndSend("order.exchange", "order.routing.key", message, correlationData);
}
/**
* 發(fā)送延遲消息
*/
public void sendDelayedMessage(String message, int delayMillis) {
Message msg = MessageBuilder.withBody(message.getBytes()).setHeader("x-delay", delayMillis).build();
rabbitTemplate.send("delayed.exchange", "delayed.routing.key", msg);
}
}在上述代碼中:
sendSimpleMessage方法用于發(fā)送簡單的字符串消息,它直接使用rabbitTemplate的convertAndSend方法,將消息發(fā)送到指定的交換機(jī)和路由鍵。sendOrderMessage方法用于發(fā)送對象消息,在發(fā)送前,通過 Lambda 表達(dá)式設(shè)置消息的內(nèi)容類型為application/json,這樣接收方可以正確地解析消息。sendConfirmMessage方法發(fā)送帶有確認(rèn)機(jī)制的消息,通過CorrelationData為消息設(shè)置一個(gè)唯一的標(biāo)識,方便后續(xù)確認(rèn)消息是否成功發(fā)送。sendDelayedMessage方法用于發(fā)送延遲消息,它使用MessageBuilder構(gòu)建消息,并設(shè)置x-delay頭來指定延遲時(shí)間 。
(二)發(fā)布者確認(rèn)回調(diào)
發(fā)布者確認(rèn)回調(diào)是確保消息成功發(fā)送到 RabbitMQ 的重要機(jī)制。在復(fù)雜的網(wǎng)絡(luò)環(huán)境中,消息的發(fā)送可能會因?yàn)楦鞣N原因失敗,比如網(wǎng)絡(luò)波動(dòng)、RabbitMQ 服務(wù)器故障等。發(fā)布者確認(rèn)回調(diào)就像是消息發(fā)送的 “安全衛(wèi)士”,它可以讓生產(chǎn)者及時(shí)了解消息的發(fā)送狀態(tài),從而采取相應(yīng)的措施,避免消息丟失。
在 Spring Boot 中,我們可以通過@PostConstruct注解來初始化RabbitTemplate的確認(rèn)回調(diào)方法。以下是具體的代碼實(shí)現(xiàn):
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MessageProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
@PostConstruct
public void init() {
rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
if (ack) {
System.out.println("消息發(fā)送成功: " + correlationData);
} else {
System.err.println("消息發(fā)送失敗: " + cause);
}
});
}
}在上述代碼中,init方法使用@PostConstruct注解,確保在MessageProducer實(shí)例化后,立即初始化RabbitTemplate的確認(rèn)回調(diào)。setConfirmCallback方法接收一個(gè)回調(diào)函數(shù),當(dāng)消息發(fā)送到 RabbitMQ 后,RabbitMQ 會根據(jù)消息的處理結(jié)果調(diào)用這個(gè)回調(diào)函數(shù)。correlationData是消息的唯一標(biāo)識,ack表示消息是否成功被 RabbitMQ 接收,cause則在消息發(fā)送失敗時(shí),提供失敗的原因 。
五、消費(fèi)者:消息的歸宿
(一)消費(fèi)者組件開發(fā)
在 Spring Boot 中,我們使用@RabbitListener注解來開發(fā)消費(fèi)者組件。這個(gè)注解就像是一個(gè)消息監(jiān)聽的 “哨崗”,一旦有消息進(jìn)入指定的隊(duì)列,它就會立即觸發(fā)對應(yīng)的方法來處理消息。以下是一個(gè)消費(fèi)者組件的示例代碼:
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class OrderConsumer {
@RabbitListener(queues = "order.queue")
public void receiveOrder(String message) {
System.out.println("接收到訂單消息: " + message);
// 處理訂單消息的業(yè)務(wù)邏輯
// 比如調(diào)用訂單處理服務(wù),更新訂單狀態(tài)等
}
}在上述代碼中,@RabbitListener注解標(biāo)注在receiveOrder方法上,指定監(jiān)聽的隊(duì)列是order.queue。當(dāng)有消息進(jìn)入該隊(duì)列時(shí),receiveOrder方法會被自動(dòng)調(diào)用,message參數(shù)就是隊(duì)列中的消息內(nèi)容。在實(shí)際應(yīng)用中,我們可以在這個(gè)方法中編寫具體的業(yè)務(wù)邏輯,比如解析訂單數(shù)據(jù)、調(diào)用訂單處理服務(wù)、更新訂單狀態(tài)到數(shù)據(jù)庫等 。
(二)手動(dòng)確認(rèn)與異常處理
在消息處理過程中,手動(dòng)確認(rèn)消息是確保消息可靠性的重要環(huán)節(jié)。當(dāng)消費(fèi)者成功處理完消息后,需要手動(dòng)調(diào)用basicAck方法通知 RabbitMQ,這樣 RabbitMQ 才會將該消息從隊(duì)列中移除。如果消費(fèi)者在處理消息時(shí)發(fā)生異常,我們可以通過調(diào)用basicNack方法拒絕消息,并根據(jù)業(yè)務(wù)需求決定是否將消息重新放回隊(duì)列或讓其進(jìn)入死信隊(duì)列。
以下是一個(gè)包含手動(dòng)確認(rèn)和異常處理的消費(fèi)者代碼示例:
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class OrderConsumer {
@RabbitListener(queues = "order.queue")
public void receiveOrder(Message message, Channel channel) {
long deliveryTag = message.getMessageProperties().getDeliveryTag();
try {
String msg = new String(message.getBody());
System.out.println("接收到訂單消息: " + msg);
// 處理訂單消息的業(yè)務(wù)邏輯
// 模擬業(yè)務(wù)處理成功
boolean success = true;
if (success) {
// 手動(dòng)確認(rèn)消息,參數(shù)1:消息的唯一標(biāo)識,參數(shù)2:是否批量確認(rèn),這里設(shè)置為false表示只確認(rèn)當(dāng)前這一條消息
channel.basicAck(deliveryTag, false);
} else {
// 拒絕消息,參數(shù)1:消息的唯一標(biāo)識,參數(shù)2:是否批量拒絕,參數(shù)3:是否重新放回隊(duì)列,這里設(shè)置為false表示不重新放回隊(duì)列,消息會進(jìn)入死信隊(duì)列
channel.basicNack(deliveryTag, false, false);
}
} catch (Exception e) {
try {
// 處理異常時(shí)拒絕消息,進(jìn)入死信隊(duì)列
channel.basicNack(deliveryTag, false, false);
} catch (Exception ex) {
ex.printStackTrace();
}
e.printStackTrace();
}
}
}在上述代碼中,receiveOrder方法接收Message和Channel兩個(gè)參數(shù)。Message包含了從隊(duì)列中獲取的消息內(nèi)容和相關(guān)屬性,Channel則用于與 RabbitMQ 進(jìn)行交互,執(zhí)行確認(rèn)或拒絕消息的操作。在try塊中,我們模擬了業(yè)務(wù)處理的過程,根據(jù)處理結(jié)果調(diào)用basicAck或basicNack方法。如果在處理過程中發(fā)生異常,在catch塊中,我們先調(diào)用basicNack方法拒絕消息,讓其進(jìn)入死信隊(duì)列,然后打印異常信息,以便后續(xù)排查問題 。
六、測試與驗(yàn)證:眼見為實(shí)
(一)啟動(dòng)項(xiàng)目
在完成上述配置和開發(fā)后,我們就可以啟動(dòng) Spring Boot 項(xiàng)目了。啟動(dòng)項(xiàng)目就像是給整個(gè)消息通信系統(tǒng)按下了 “啟動(dòng)鍵”,讓各個(gè)組件開始運(yùn)轉(zhuǎn)起來。我們可以使用 IDE(如 IntelliJ IDEA 或 Eclipse)的啟動(dòng)按鈕直接啟動(dòng)項(xiàng)目,也可以在項(xiàng)目根目錄下通過命令行運(yùn)行mvn spring-boot:run來啟動(dòng)。
當(dāng)項(xiàng)目啟動(dòng)時(shí),Spring Boot 會自動(dòng)讀取application.yml中的配置信息,嘗試與 RabbitMQ 服務(wù)器建立連接。如果連接成功,控制臺會輸出一些與 RabbitMQ 相關(guān)的日志信息,表明項(xiàng)目已經(jīng)成功連接到 RabbitMQ 服務(wù)器。同時(shí),Spring 容器會根據(jù)配置類中使用注解聲明的隊(duì)列、交換機(jī)和綁定關(guān)系,在 RabbitMQ 服務(wù)器上創(chuàng)建相應(yīng)的組件。例如,我們之前聲明的訂單隊(duì)列、死信隊(duì)列、訂單交換機(jī)和死信交換機(jī)等都會被創(chuàng)建出來,為后續(xù)的消息發(fā)送和接收做好準(zhǔn)備 。
(二)發(fā)送與接收消息
為了驗(yàn)證消息的發(fā)送和接收是否正常,我們可以通過測試接口或單元測試來發(fā)送消息。如果項(xiàng)目中添加了 Spring Web 依賴,我們可以創(chuàng)建一個(gè)簡單的控制器類,提供一個(gè)發(fā)送消息的接口。例如:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MessageController {
@Autowired
private MessageProducer messageProducer;
@GetMapping("/send")
public String sendMessage(@RequestParam String message) {
messageProducer.sendSimpleMessage(message);
return "消息發(fā)送成功: " + message;
}
}在上述代碼中,MessageController類提供了一個(gè)/send接口,接收一個(gè)message參數(shù),并調(diào)用MessageProducer的sendSimpleMessage方法發(fā)送消息。我們可以通過瀏覽器訪問http://localhost:8080/send?message=Hello,RabbitMQ!(假設(shè)項(xiàng)目的端口為 8080)來發(fā)送消息。
發(fā)送消息后,我們可以觀察控制臺輸出,查看消費(fèi)者是否成功接收到消息。如果消費(fèi)者組件配置正確,控制臺會輸出類似于 “接收到訂單消息: Hello,RabbitMQ!” 的日志信息。同時(shí),我們還可以登錄 RabbitMQ 管理界面,在 “Queues” 頁面中查看隊(duì)列的消息數(shù)量變化。如果消息發(fā)送和接收正常,我們會看到訂單隊(duì)列的消息數(shù)量先增加(因?yàn)樯a(chǎn)者發(fā)送了消息),然后減少(因?yàn)橄M(fèi)者接收并處理了消息)。
除了通過接口發(fā)送消息,我們還可以使用單元測試來驗(yàn)證消息的發(fā)送和接收。在src/test/java目錄下創(chuàng)建一個(gè)測試類,例如MessageTest:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertTrue;
@SpringBootTest
public class MessageTest {
@Autowired
private MessageProducer messageProducer;
@Test
public void testSendMessage() {
String message = "Test message from unit test";
messageProducer.sendSimpleMessage(message);
// 這里可以添加更多的斷言來驗(yàn)證消息發(fā)送的結(jié)果,比如確認(rèn)回調(diào)是否被正確調(diào)用等
assertTrue(true);
}
}在上述單元測試中,我們注入了MessageProducer并調(diào)用其sendSimpleMessage方法發(fā)送消息。雖然目前只是簡單地?cái)嘌詼y試通過,但在實(shí)際應(yīng)用中,我們可以添加更多的斷言邏輯,比如驗(yàn)證確認(rèn)回調(diào)是否被正確調(diào)用、消息是否成功進(jìn)入隊(duì)列等,以確保消息發(fā)送的正確性 。
到此這篇關(guān)于Spring Boot 4.0 牽手RabbitMQ注解魔法開啟消息之旅的文章就介紹到這了,更多相關(guān)Spring Boot RabbitMQ注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MAC 系統(tǒng)如何使用 Sublime Text 2 直接編譯運(yùn)行 java 代碼
這篇文章主要介紹了MAC 系統(tǒng)如何使用 Sublime Text 2 直接編譯運(yùn)行 java 代碼,需要的朋友可以參考下2014-10-10
Java基于jdbc實(shí)現(xiàn)的增刪改查操作示例
這篇文章主要介紹了Java基于jdbc實(shí)現(xiàn)的增刪改查操作,結(jié)合實(shí)例形式分析了java使用jdbc進(jìn)行數(shù)據(jù)庫的連接、增刪改查等基本操作技巧,需要的朋友可以參考下2019-01-01
SpringBoot中實(shí)現(xiàn)多線程6種方式總結(jié)
這篇文章主要為大家詳細(xì)介紹了在Spring Boot中實(shí)現(xiàn)多線程的6種方式,文章的示例代碼講解詳細(xì),大家可以結(jié)合不同場景和需求進(jìn)行靈活選擇2025-08-08
Spring中@ControllerAdvice注解的用法解析
這篇文章主要介紹了Spring中@ControllerAdvice注解的用法解析,顧名思義,@ControllerAdvice就是@Controller 的增強(qiáng)版,@ControllerAdvice主要用來處理全局?jǐn)?shù)據(jù),一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用,需要的朋友可以參考下2023-10-10
Eclipse的Debug調(diào)試技巧大全(總結(jié))
這篇文章主要介紹了Eclipse的Debug調(diào)試技巧大全(總結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12

