Spring AMQP 入门与实践:整合 RabbitMQ 构建可靠消息系统

一、Spring AMQP 是什么?

Spring AMQP(Application Messaging Protocol)是 Spring 官方提供的对 AMQP 协议的封装,其核心模块有两个:

  • spring-amqp: 提供 AMQP 抽象封装
  • spring-rabbit: RabbitMQ 的具体实现

SpringAMQP提供了三个功能:

  • 自动声明队列、交换机及其绑定关系
  • 基于注解的监听器模式,异步接收消息
  • 封装了RabbitTemplate工具,用于发送消息

常见的场景包括:

  • 微服务之间的异步通信
  • 秒杀系统削峰
  • 用户注册发送邮件/短信通知
  • 分布式事务的最终一致性方案

二、Spring Boot 集成 RabbitMQ

2.1. 引入依赖

<!--AMQP依赖,包含RabbitMQ-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

它会自动引入 spring-rabbit 和 spring-amqp 模块。

2.2. 配置 RabbitMQ

spring:rabbitmq:host: 192.168.184.101 # 你的虚拟机IPport: 5672 # 端口virtual-host: /hmall # 虚拟主机username: hmall # 用户名password: 123 # 密码

三、快速构建消息系统

  • 一个消息队列
  • 一个消息发送者
  • 一个消息监听者(消费者)

构建示例项目:

  • mq-demo:父工程,管理项目依赖
  • publisher:消息的发送者
  • consumer:消息的消费者
    在这里插入图片描述
    引入依赖:
<?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>

3.1.消息发送

publisher服务中编写测试类SpringAmqpTest,并利用RabbitTemplate实现消息发送:

package com.itheima.publisher.amqp;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
public class SpringAmqpTest {@Autowiredprivate RabbitTemplate rabbitTemplate;@Testpublic void testSimpleQueue() {// 队列名称String queueName = "simple.queue";// 消息String message = "hello, spring amqp!";// 发送消息rabbitTemplate.convertAndSend(queueName, message);}
}

3.2.消息接收

consumer服务的com.itheima.consumer.listener包中新建一个类SpringRabbitListener,代码如下:

package com.itheima.consumer.listener;import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class SpringRabbitListener {// 利用RabbitListener来声明要监听的队列信息// 将来一旦监听的队列中有了消息,就会推送给当前服务,调用当前方法,处理消息。// 可以看到方法体中接收的就是消息体的内容@RabbitListener(queues = "simple.queue")public void listenSimpleQueueMessage(String msg) throws InterruptedException {System.out.println("spring 消费者接收到消息:【" + msg + "】");}
}

四、WorkQueues模型

4.1. 介绍

Work Queues(工作队列)又叫 任务队列(Task Queues),主要用于将一个任务分发给多个消费者(工作线程)处理,每个任务只会被一个消费者处理。

核心思想是:生产者只管发送任务,多个消费者竞争获取任务并处理,达到并发消费、分担压力的目的
在这里插入图片描述

  • Producer(生产者):发送任务消息。
  • Queue(队列):缓存任务。
  • Consumer(消费者):从队列中获取任务并处理。

每个任务只会被一个消费者处理,多个消费者之间互不干扰。

4.2. 消息发送

publisher服务中的SpringAmqpTest类中添加一个测试方法实现循环发送:

/*** workQueue* 向队列中不停发送消息,模拟消息堆积。*/
@Test
public void testWorkQueue() throws InterruptedException {// 队列名称String queueName = "simple.queue";// 消息String message = "hello, message_";for (int i = 0; i < 50; i++) {// 发送消息,每20毫秒发送一次,相当于每秒发送50条消息rabbitTemplate.convertAndSend(queueName, message + i);Thread.sleep(20);}
}

4.3. 消息接收

@RabbitListener(queues = "work.queue")
public void listenWorkQueue1(String msg) throws InterruptedException {System.out.println("消费者1接收到消息:【" + msg + "】" + LocalTime.now());Thread.sleep(20);
}@RabbitListener(queues = "work.queue")
public void listenWorkQueue2(String msg) throws InterruptedException {System.err.println("消费者2........接收到消息:【" + msg + "】" + LocalTime.now());Thread.sleep(200);
}

多个消费者监听同一个队列,消息将被平均分配(默认轮询方式)。

4.4. 公平分发 vs 轮询分发

🔁 默认行为:轮询分发
RabbitMQ 默认采用 Round-Robin(轮询) 分发方式,消费者不论是否处理完当前消息,下一条消息仍然会发给它。

这可能导致:处理慢的消费者积压任务,处理快的消费者反而闲着

✅ 公平分发(prefetch)
设置每个消费者的最大未确认消息数,让 RabbitMQ 只向空闲的消费者发送消息。

spring:rabbitmq:listener:simple:prefetch: 1  # 每个消费者同一时间只能处理1条消息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92603.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92603.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92603.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像处理控件Aspose.Imaging教程:使用 C# 将 SVG 转换为 EMF

Aspose.Imaging for .NET是一款深受 .NET 开发人员喜爱的图像处理 SDK&#xff0c;因为它灵活且易于开发人员使用。EMF 图像文件格式提供出色的打印质量和可扩展性。此外&#xff0c;这种图像文件格式还节省存储空间。Aspose.Imaging for .NET 能够使 SVG 到 EMF 的转换变得简…

网络编程——套接字

目录 一、Socket套接字 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;分类 1.流套接字&#xff1a; 2.数据报套接字 3.原始套接字 二、TCP协议VSUDP协议 &#xff08;一&#xff09;有连接VS无连接 &#xff08;二&#xff09;可靠传输VS不可靠传输 &a…

Git 基础操作笔记(速查)

1. 初始化仓库git init在当前文件夹初始化一个新的 Git 仓库。2. 克隆仓库git clone <仓库地址>从远程仓库复制项目到本地。3. 查看文件状态git status查看工作区和暂存区的文件状态。4. 添加文件到暂存区git add <文件名> git add . # 添加所有改动文件5. 提…

【并查集】P3367 【模板】并查集

P3367 【模板】并查集 题目背景 本题数据范围已经更新到 1≤N≤21051\le N\le 2\times 10^51≤N≤2105&#xff0c;1≤M≤1061\le M\le 10^61≤M≤106。 题目描述 如题&#xff0c;现在有一个并查集&#xff0c;你需要完成合并和查询操作。 输入格式 第一行包含两个整数 N,MN,M…

MyBatis流式查询详解

MyBatis 流式查询详解&#xff1a;ResultHandler 与 Cursor 在业务中&#xff0c;如果一次性查询出百万级数据并返回 List&#xff0c;很容易造成 OOM 或 长时间 GC。 MyBatis 提供了 流式查询&#xff08;Streaming Query&#xff09; 能力&#xff0c;让我们可以边读边处理&a…

1Panel Agent 证书绕过实现远程命令执行漏洞复现(CVE-2025-54424)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 前…

kettle插件-kettle http post plus插件,轻松解决https post接口无法调用文件流下载问题

场景&#xff1a;小伙伴在使用kettle调用https post接口过程中无法正常调用&#xff0c;程序出错问题&#xff0c;今天演示下用自研插件轻松解决这个问题。1、使用openssl 生成自签名证书openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 3652、…

剑指offer第2版——面试题2:实现单例

文章目录一、题目二、考察点三、答案3.1 C11写法3.2 C98写法&#xff08;线程安全只存在于懒汉模式&#xff09;3.2.1 小菜写法3.2.2 小菜进阶写法3.2.3 中登写法3.2.3 老鸟写法四、扩展知识4.1 饿汉模式和懒汉模式的区别4.1.1 饿汉模式&#xff08;Eager Initialization&#…

OpenAI开源大模型gpt-oss系列深度解析:从120B生产级到20B桌面级应用指南

引言&#xff1a;OpenAI开源里程碑&#xff0c;AI民主化加速到来 2025年8月&#xff0c;OpenAI正式宣布开源其两款重磅大语言模型——gpt-oss-120b&#xff08;1200亿参数生产级模型&#xff09;和gpt-oss-20b&#xff08;200亿参数桌面级模型&#xff09;&#xff0c;引发全球…

本地部署文档管理平台 BookStack 并实现外部访问( Windows 版本)

BookStack 是一款专注于书籍、文档管理的开源平台&#xff0c;它界面设计直观简洁&#xff0c;功能强大且易于使用&#xff0c;允许用户创建、组织和分享文档资料&#xff0c;特别适合用于构建内部文档系统、知识库或公开的文档站点。本文将详细介绍如何在 Windows 系统本地部署…

VS Code编辑器

实际上&#xff0c;‌Visual Studio Code&#xff08;简称VS Code&#xff09;‌是由微软开发的免费、开源、跨平台的代码编辑器&#xff0c;支持多种编程语言和框架&#xff0c;广泛应用于现代Web和云应用开发。这也是个编辑器&#xff0c;可能是继 GitHub 的 Atom 之后的一枝…

自动化测试篇--BUG篇

目录 一.软件测试的生命周期 二.bug是什么&#xff1f; 三.如何描述一个bug&#xff1f; 四.bug的级别 五.bug的生命周期 六.测试与开发产生争执怎么办&#xff1f;&#xff08;重要&#xff01;&#xff01;&#xff01;&#xff09; 一.软件测试的生命周期 软件测试人员…

Solidity智能合约基础

基础学习使用 remix&#xff1a;ide Remix - Ethereum IDE evm&#xff1a;ethreum virtual machine evm字节码 强类型脚本语言 compile >evm bytescode >evm hello的样例 声明的关键字&#xff1a;contract // SPDX-License-Identifier: MIT pragma solidi…

Unity跨平台超低延迟的RTSP/RTMP播放器技术解析与实战应用

✳️ 引言&#xff1a;为什么说 Unity 中的视频能力是“可视化神经元”&#xff1f; 随着“可视化 实时性”成为工业数字化的关键支撑&#xff0c;Unity 正从传统游戏引擎&#xff0c;演进为数字孪生系统、智能机器人中控、虚拟交互平台、XR 可视引擎等领域的底层核心。它不再…

python学智能算法(三十三)|SVM-构建软边界拉格朗日方程

【1】引用 在前序学习进程中&#xff0c;我们初步了解了SVM软边界&#xff0c;今天就更进一步&#xff0c;尝试构建SVM软边界的拉格朗日函数。 【2】基本问题 在SVM软边界中&#xff0c;我们已经获得此时的最优化几何距离的表达式&#xff1a; fmin⁡12∣∣w∣∣2C∑i1nξif…

【YOLOv5】

Focus模块&#xff1a;早期再yolov5版本提出&#xff0c;后期被常规卷积替换&#xff0c;作用是图像进入主干网络之前&#xff0c;进行隔行隔列采样&#xff0c;把空间维度堆叠到通道上&#xff0c;减少计算量。 SPPF:SPP的改进版本&#xff0c;把SPP的不同池化核改变为K 5 的…

Pytest项目_day05(requests加入headers)

headers 由于每个请求都需要加入一些固定的参数&#xff0c;例如&#xff1a;cookies、user-agent&#xff0c;那么将这些固定参数放入URL或params中会显得很臃肿&#xff0c;因此一般将这些参数放在request headers中headers的反爬作用 在豆瓣网站中&#xff0c;如果我们不加入…

安全引导功能及ATF的启动过程(四)

安全引导功能及ATF的启动过程&#xff08;四&#xff09; ATF中bl31的启动 在bl2中触发安全监控模式调用后会跳转到bl31中执行&#xff0c;bl31最主要的作用是建立EL3运行态的软件配置&#xff0c;在该阶段会完成各种类型的安全监控模式调用ID的注册和对应的ARM核状态的切换&am…

从手工到智能决策,ERP让制造外贸企业告别“数据孤岛“降本增效

在全球化竞争加剧的当下&#xff0c;制造型外贸企业正面临订单碎片化、供应链复杂化、合规风险上升等多重挑战。数字化转型已成为企业突破增长瓶颈、构建核心竞争力的必选项。然而&#xff0c;许多企业在推进过程中因选型不当陷入“系统孤岛”“数据失真”“流程低效”等困境。…

DMETL简单介绍、安装部署和入门尝试

一、DMETL的介绍1.1 概述我们先来简单了解一下DMETL。DMETL是什么&#xff1f;说的简单一点&#xff0c;DMETL一款数据处理与集成平台&#xff1b;从功能来说&#xff0c;那DMETL就是对数据同步、数据处理以及数据交换共享提供一站式支持的平台&#xff1b;从它的意义来说&…