第五章 RabbitMQ之快速入门Spring AMQP开发

server/2024/10/11 7:26:43/

目录

一、AMQP与Sping AMQP 

1.1. SpringAMQP常用类

1.2. SpringAMQP常用注解

1.3. 实际电商项目示例代码 

二、 案例代码演示

2.1. 案例需求

2.2. 实现代码

2.2.1. 创建SpringBoot工程

2.2.2. 父工程pom依赖

2.2.3. 生产者pom依赖 

 2.2.3. 生产者配置文件

2.2.4. 生产者核心代码

2.2.5. 消费者RabbitMQConfig

 2.2.6. 消费者pom依赖

2.2.7. 消费者配置文件

2.2.8.  消费者核心代码

2.3. 运行效果


RabbitMQ官网

https://www.rabbitmq.com/

一、AMQP与Sping AMQP 

RabbitMQ此处编写的是Java的原始的API,我们可以通过Spring的AMQP来简化我们对RabbitMQ的开发使用: 

 Spring AMQP实现了一套统一的Java AMQP标准,我们在使用Spring AMQP的API时,不需要关心底层实现,Spring已经帮助我们调用了AMQP协议,简化我们的开发。 Spring AMQP的默认实现是Spring-Rabbit。

1.1. SpringAMQP常用类

SpringAMQP提供的声明类,用来声明队列、交换机及其绑定关系:

Queue:用于声明队列,可以用工厂类QueueBuilder构建

Exchange:用于声明交换机,可以用工厂类ExchangeBuilder构建

Binding:用于声明队列和交换机的绑定关系,可以用工厂类BindingBuilder构建

我们在实际项目中也可以通过new的方式来创建Queue、Exchange和Binding

1.2. SpringAMQP常用注解

SpringAMQP还提供了基于@RabbitListener注解来声明队列和交换机的方式:

java">@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue1"),exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),key = {"red", "blue"}))public void listenDirectQueue1(String msg) {System.out.println("消费者1接收到Direct消息:【"+msg+"】");}

1.3. 实际电商项目示例代码 

支付服务的代码里,通过支付成功向订单服务发送消息修改订单状态:

通过@RabbitListener注解声明一个消费者的业务代码,接收支付成功消息,修改订单状态为已支付:

二、 案例代码演示

2.1. 案例需求

1. 利用控制台创建队列simple.queue

2. 在publisher服务中,利用SpringAMQP直接向simple.queue发送消息

3. 在consumer服务中,利用SpringAMQP编写消费者,监听simple.queue队列

2.2. 实现代码

2.2.1. 创建SpringBoot工程

完整的工程目录结构及代码文件如下:

2.2.2. 父工程pom依赖

引入核心依赖

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>mq-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>mq-demo</name><description>mq-demo</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version></properties><dependencies><!-- spring amqp依赖 --><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><scope>test</scope></dependency><dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.2.3. 生产者pom依赖 

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>publisher</artifactId><version>0.0.1-SNAPSHOT</version><name>publisher</name><description>publisher</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

 2.2.3. 生产者配置文件

spring:rabbitmq:# 主机host: 127.0.0.1# 端口port: 5672# 默认用户密码是guest guest 如果需要自己创建新用户,参看我的上一章节内容username: Wangzhexiaopassword: Wangzhexiao# 默认的虚拟主机是/ 如果需要自己创建虚拟主机,参看我的上一章节内容virtual-host: /hangzhou

2.2.4. 生产者核心代码

java">package com.example.publisher;import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class PublisherApplicationTests {@Resourceprivate RabbitTemplate rabbitTemplate;@Testvoid sendMessage() {// 队列名称String queueName = "simple.queue";// 消息内容String message = "人生苦短,持续不断地努力拼搏,迎难而上!";rabbitTemplate.convertAndSend(queueName, message);}
}

2.2.5. 消费者RabbitMQConfig

队列、交换机及绑定关系,通常是在消费者这一侧配置,生产者不关心这些配置:

java">package com.example.consumer;import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {@BeanQueue myQueue() {// 使用 QueueBuilder 创建一个持久化队列return QueueBuilder.durable("simple.queue").build();}
}

 2.2.6. 消费者pom依赖

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>consumer</artifactId><version>0.0.1-SNAPSHOT</version><name>consumer</name><description>consumer</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.34</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.2.7. 消费者配置文件

spring:rabbitmq:# 主机host: 127.0.0.1# 端口port: 5672# 默认用户密码是guest guest 如果需要自己创建新用户,参看我的上一章节内容username: Wangzhexiaopassword: Wangzhexiao# 默认的虚拟主机是/ 如果需要自己创建虚拟主机,参看我的上一章节内容virtual-host: /hangzhou

2.2.8.  消费者核心代码

SpringAMQP提供声明式的消息监听,我们只需要通过注解在方法上声明要监听的队列名称,将来SpringAMQP就会把消息传递给当前方法:

java">package com.example.consumer;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class SimpleListener {@RabbitListener(queues = "simple.queue")public void listener(String message) {log.info("人生是个不断攀登的过程:{}", message);}
}

2.3. 运行效果

 


http://www.ppmy.cn/server/130025.html

相关文章

Oracle RAC IPC Send timeout detected问题分析处理

一、报错信息 今天在进行数据库巡检时&#xff0c;在集群节点1发现了IPC相关报错信息&#xff1a; 2024-10-10T10:22:06.84631708:00 IPC Receiver dump detected. Sender instance 2 Receiver pnum 277 ospid 377527 [oraclezxsszpt-sjkfwq1 (PPA6)], pser 124403 2024-10-1…

Cherno游戏引擎笔记(73~90)

------- scene viewport ---------- 》》》》做了两件事&#xff1a;设置视口和设置相机比例 》》》》为什么要设置 m_ViewportSize 为 glm::vec2 而不是 ImVec2 ? 因为后面需要进行 ! 运算&#xff0c;而 ImVec2 没有这个运算符的定义&#xff0c;只有 glm::vec2 有这个运算…

洗衣店订单处理:Spring Boot系统的优势

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

nginx 资料整理(二)- HTTP

nginx 资料整理&#xff08;二&#xff09; 1. HTTP1. HTTP是什么&#xff1f;2. 什么是超文本&#xff1f;3. 协议版本概述4. 协议版本详解HTTP/0.9HTTP/1.0HTTP/1.1HTTPSSPDYHTTP/2.0 2. HTTP请求与响应1. HTTP请求1. 请求起始行2. 请求头(Request Headers)3. 空行(Blank Lin…

JS 怎么监听复制事件 并获取复制内容 并修改复制文本内容

需求背景&#xff1a; 需要禁用部分文本内容的复制事件&#xff0c;并且在复制事件发生时&#xff0c;将复制的文本内容通过接口传给后端。 上代码&#xff1a; // 使用Dom获取需要操作禁用时间的元素let element: any document.getElementById(test1);// 为该元素添加 copy 事…

el-date-picker设置只有某些日期可选

示例图&#xff1a; <el-date-pickerv-model"topFormObj.upTime"type"date"value-format"timestamp"format"dd/MM/yyyy":picker-options"pickerOptions" /> 固定限制每周的周末周三不可选 data() {return {pickerOp…

基于IMX6UL的EPIT的定时器实验

定时器是最常用的外设&#xff0c;常常需要使用定时器来完成精准的定时功能&#xff0c;I.MX6U 提供了多 种硬件定时器&#xff0c;有些定时器功能非常强大。本章我们从最基本的 EPIT 定时器开始&#xff0c;学习如何配置EPIT 定时器&#xff0c;使其按照给定的时间&#xff0c…

windows C++-windows C++-使用任务和 XML HTTP 请求进行连接(二)

6. 在 HttpRequest.h 中&#xff0c;添加此代码: namespace Web {namespace Details {// 用于执行异步HTTP请求的实用程序类。 // 此类一次只支持一个未完成的请求。 class HttpRequest { public:HttpRequest();int GetStatusCode() const{return statusCode;}std::wstring c…