將來我們開發(fā)業(yè)務(wù)功能的時候,肯定不會在控制臺收發(fā)消息,而是應(yīng)該基于編程的方式。由于RabbitMQ采用了AMQP協(xié)議,因此它具備跨語言的特性。任何語言只要遵循AMQP協(xié)議收發(fā)消息,都可以與RabbitMQ交互。并且RabbitMQ官方也提供了各種不同語言的客戶端。
但是,RabbitMQ官方提供的Java客戶端編碼相對復雜,一般生產(chǎn)環(huán)境下我們更多會結(jié)合Spring來使用。而Spring的官方剛好基于RabbitMQ提供了這樣一套消息收發(fā)的模板工具:SpringAMQP。并且還基于SpringBoot對其實現(xiàn)了自動裝配,使用起來非常方便。
https://spring.io/projects/spring-amqp

SpringAMQP提供了三個功能:
- 自動聲明隊列、交換機及其綁定關(guān)系
- 基于注解的監(jiān)聽器模式,異步接收消息
- 封裝了RabbitTemplate工具,用于發(fā)送消息
演示步驟:

1. 創(chuàng)建工程

包括三部分:
- mq-demo:父工程,管理項目依賴
- publisher:消息的發(fā)送者
- consumer:消息的消費者
在mq-demo這個父工程中,已經(jīng)配置好了SpringAMQP相關(guān)的依賴:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.itcast.demo</groupId>
<artifactId>mq-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>publisher</module>
<module>consumer</module>
</modules>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
<relativePath/>
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--AMQP依賴,包含RabbitMQ-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!--單元測試-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
</project>
因此,子工程中就可以直接使用SpringAMQP了。
2. 快速入門
在之前的案例中,我們都是經(jīng)過交換機發(fā)送消息到隊列,不過有時候為了測試方便,我們也可以直接向隊列發(fā)送消息,跳過交換機。
在入門案例中,我們就演示這樣的簡單模型,如圖:

也就是:
- publisher直接發(fā)送消息到隊列
- 消費者監(jiān)聽并處理隊列中的消息
為了方便測試,我們現(xiàn)在控制臺新建一個隊列:simple.queue

接下來,我們就可以利用Java代碼收發(fā)消息了。
3. 消息發(fā)送
首先配置MQ地址,在publisher服務(wù)的application.yml中添加配置:
spring:
rabbitmq:
host: 192.168.56.1 # 你的虛擬機IP
port: 5672 # 端口
virtual-host: /hmall # 虛擬主機
username: hmall # 用戶名
password: 123 # 密碼
然后在publisher服務(wù)中編寫測試類SpringAmqpTest,并利用RabbitTemplate實現(xiàn)消息發(fā)送:
package com.itheima.publisher;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringAmqpTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testSimpleQueue() {
// 1. 隊列名
String queueName = "simple.queue";
// 2. 消息
String message = "hello, spring amqp!";
// 3. 發(fā)送消息
rabbitTemplate.convertAndSend(queueName, message);
}
}
打開控制臺,可以看到消息已經(jīng)發(fā)送到隊列中:

4. 消息接收
首先配置MQ地址,在consumer服務(wù)的application.yml中添加配置:
spring:
rabbitmq:
host: 192.168.56.1 # 你的虛擬機IP
port: 5672 # 端口
virtual-host: /hmall # 虛擬主機
username: hmall # 用戶名
password: 123 # 密碼
然后在consumer服務(wù)的com.itheima.consumer.listener包中新建一個類SpringRabbitListener,代碼如下:
@Slf4j
@Component
public class SpringRabbitListener {
// 利用RabbitListener來聲明要監(jiān)聽的隊列信息
// 將來一旦監(jiān)聽的隊列中有了消息,就會推送給當前服務(wù),調(diào)用當前方法,處理消息。
// 可以看到方法體中接收的就是消息體的內(nèi)容
@RabbitListener(queues = "simple.queue")
public void listenSimpleQueueMessage(String msg) {
log.info("spring 消費者接收到消息:【" + msg + "】");
}
啟動consumer服務(wù),然后在publisher服務(wù)中運行測試代碼,發(fā)送MQ消息。最終consumer收到消息:

如果覺得有收獲,歡迎點贊和評論,更多知識,請點擊關(guān)注查看我的主頁信息哦~