Java研学-RabbitMQ(三)

一 消息通信协议

1 AMQP

  AMQP 是一个开放的、跨语言、跨平台的消息协议标准,用于在分布式系统中传递业务消息。它定义了消息队列的二进制协议格式和交互模型(如交换机、队列、绑定等),确保不同语言(Java、Python、C#等)和平台(RabbitMQ、Qpid等)的实现能够互操作。

2 Spring AMQP

  Spring AMQP 是 Spring 框架对 AMQP 协议(如 RabbitMQ)的抽象与封装,提供了一套简洁的 Java API 来简化消息的生产和消费。
  它通过AmqpTemplate模板类实现消息的快速发送(如自动序列化、路由键设置),结合@RabbitListener注解实现声明式的消费者监听,同时支持动态声明交换机、队列和绑定(通过 RabbitAdmin),并深度集成 Spring 生态(如依赖注入、事务管理)。
  其核心优势在于隐藏底层协议细节,让开发者仅需关注业务逻辑,无需手动处理连接、通道或消息确认等复杂操作,从而高效构建异步、解耦的分布式系统。

二 入门demo

1 项目路径图

在这里插入图片描述

2 交换机与队列准备

  创建虚拟主机/midhuang,使用其中的交换机amq.fanout,与队列xiaohuang.queue1进行绑定。

3 父工程导入依赖

  创建spring项目,为父工程导入依赖,两个子工程会会自动继承这些依赖

        <!-- Lombok:简化Java代码(如自动生成Getter/Setter--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- Spring AMQP + RabbitMQ 集成 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><!-- Spring Boot 单元测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

4 各个微服务中配置文件

  ① consumer(消费者),5672是用来发消息的端口,15672是Web控制台

spring:rabbitmq:host: 192.168.44.128port: 5672 virtual-host: /midhuangusername: dahuangpassword: "dahuang66"
logging:level:cn.tj.consumer.listeners: DEBUG # 设置为 DEBUG 以查看详细日志

  ② publisher(生产者)

spring:rabbitmq:host: 192.168.44.128port: 5672virtual-host: /midhuangusername: dahuangpassword: "dahuang66"
logging:level:cn.tj: DEBUG # 设置为 DEBUG 以查看详细日志

5 测试类发送消息

  利用RabbitTemplate发送消息

@SpringBootTest
class PublisherApplicationTests {// 注入 RabbitTemplate@Autowiredprivate RabbitTemplate rabbitTemplate;// 直接发送消息到队列@Testpublic void testHuangQueue() {// 1. 定义队列名称String queueName = ".queue";// 2. 定义消息内容String message = "hello, spring amqp!";// 3. 发送消息(默认路由到队列)rabbitTemplate.convertAndSend(queueName, message);System.out.println("消息发送成功: " + message);}
}

6 控制台检查刚刚发送消息

在这里插入图片描述

7 接收消息

  利用@RabbitListener注解声明要监听的队列,监听消息,此时消费者服务需启动保持监听状态

@Slf4j
@Component
public class MqListener {@RabbitListener(queues = "xiaohuang.queue1")public void listenHuangQueue(String msg) {log.info("收到消息: {}", msg);// 调试:打印消息长度和字节(如果 msg 为 null,会输出 "null")log.debug("消息长度: {}, 内容: {}", msg == null ? "null" : msg.length(), msg);}
}

三 Workqueues

  Workqueues(工作队列)是一种常见的任务分发模型,将多个消费者绑定到一个队列,共同消费队列中的消息,通过共享队列实现负载均衡,从而解决消息堆积问题。

1 创建队列 work.queue

在这里插入图片描述

2 添加两个消费者 – MqListener

@Slf4j
@Component
public class MqListener {@RabbitListener(queues = "work.queue")public void listenWorkQueue1(String msg) {log.info("1号消费者收到消息: {}", msg);}@RabbitListener(queues = "work.queue")public void listenWorkQueue2(String msg) {log.info("2号消费者收到消息: {}", msg);}
}

3 生产者连续发送消息 – PublisherApplicationTests

@SpringBootTest
class PublisherApplicationTests {// 注入 RabbitTemplate@Autowiredprivate RabbitTemplate rabbitTemplate;@Testvoid testWorkQueue() throws InterruptedException {String queueName = "work.queue";// 发送50条测试消息for (int i = 1; i <= 40; i++) {String msg = "hello" + i;rabbitTemplate.convertAndSend(queueName, msg);System.out.println(" [x] Sent '" + msg + "'");Thread.sleep(30); // 模拟延迟,避免消息爆发}}
}

4 控制台输出

  此时并未考虑到消费者的处理能力,RabbitMQ 默认使用 轮询(Round-Robin) 策略分发消息,这可能导致某些消费者积压大量未处理消息,而其他消费者空闲。
在这里插入图片描述

5 编写配置文件 – consumer

  prefetchCount:1像外卖小哥一次只接一单,平台会一次性给小哥派5 个订单(即使他还没处理完之前的订单)。如果小哥手慢(比如堵车),这 5 个订单都会卡在他手里,其他空闲的小哥却没订单可接。
  启用prefetchCount:1后:平台每次只给小哥派 1 个订单。小哥必须完成这个订单(送到顾客手里),平台才会派下一个订单。如果小哥 A 处理快,他很快能接下一个订单;小哥 B 处理慢,他手头的订单不会影响别人。

spring:rabbitmq:host: 192.168.44.128port: 5672virtual-host: /midhuangusername: dahuangpassword: "dahuang66"listener:simple:prefetch: 1
logging:level:cn.tj.consumer.listeners: DEBUG # 设置为 DEBUG 以查看详细日志

6 设置消费者处理速度 – MqListener

@Slf4j
@Component
public class MqListener {@RabbitListener(queues = "work.queue")public void listenWorkQueue1(String msg) throws InterruptedException {log.info("1号消费者收到消息: {}", msg);Thread.sleep(20);}@RabbitListener(queues = "work.queue")public void listenWorkQueue2(String msg) throws InterruptedException {log.debug("2号消费者收到消息: {}", msg);Thread.sleep(200);}
}

7 控制台输出

在这里插入图片描述

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

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

相关文章

http.client 教程-如何使用 Python 标准库发送 HTTP 请求

http.client 教程-如何使用 Python 标准库发送 HTTP 请求以下是 http.client 模块的详细使用教程&#xff0c;帮助你理解如何使用 Python 标准库发送 HTTP 请求&#xff1a;1. http.client 概述http.client 是 Python 内置的 HTTP 客户端库&#xff0c;提供了底层的 HTTP 协议实…

Android-三种持久化方式详解

持久化技术分为3种&#xff0c;文件&#xff0c;sharedPreferences存储&#xff0c;数据库来存储&#xff1b; 目录 文件存储&#xff1a; 利用SharedPreferences中读取数据 SQLite创建数据库 更新 添加 删除 查找&#xff1a; 文件存储&#xff1a; 文件存储是 Andr…

并发安全之锁机制一

锁机制一 锁机制是计算机系统中解决并发冲突的核心工具&#xff0c;其存在和应用场景源于一个根本问题&#xff1a;当多个执行单元&#xff08;线程、进程、分布式节点&#xff09;同时访问或修改同一份共享资源时&#xff0c;如何保证数据的正确性、一致性和系统可靠性&#x…

结合项目阐述 设计模式:单例、工厂、观察者、代理

原文链接&#xff1a;https://download.csdn.net/blog/column/12433305/133862792#_1613 1、工厂模式应用 C17及之后可编译 /*日志落地模块的实现1.抽象落地基类2.派生子类&#xff08;根据不同落地方向进行派生&#xff09;3.使用工厂模式进行创建与表示的分离 */#ifndef _…

uniapp 更新apk有缓存点不动,卸载安装apk没有问题。android

方式一。pages.json&#xff1a;"globalStyle" : {"navigationBarTextStyle" : "black","navigationBarTitleText" : "uni-app","navigationBarBackgroundColor" : "#F8F8F8","backgroundColor&qu…

HTML响应式SEO公司网站源码

核心优势 100%纯HTML/CSS开发自动适配手机/平板/PC内置SEO优化结构0.5秒极速加载 包含页面 • 首页&#xff08;关键词布局优化版&#xff09; • 服务项目展示页 • 客户案例库 • 新闻资讯系统 • 联系方式&#xff08;带地图API&#xff09; 技术参数 兼容Chrome/Firefo…

Error: llama runner process has terminated: exit status 2

我是i7 12700h ,3080显卡&#xff0c;在 Windows 11 上运行 ollama run deepseek-r1:1.5b 出现 Error: llama runner process has terminated: exit status 2 之前是好用的&#xff0c;后来不知为什么就不好用了。 原因&#xff1a; 检查 Microsoft Visual C Redistributab…

Linux中ssh远程登录原理与配置

SSH连接的五个阶段 1. 版本协商阶段&#xff08;Protocol Version Negotiation&#xff09;目的&#xff1a;协商使用SSH-1或SSH-2协议&#xff08;现代系统默认SSH-2&#xff09;。流程&#xff1a;关键点&#xff1a;若版本不兼容&#xff08;如客户端只支持SSH-1&#xff0c…

Kubernetes --存储入门

一、Volume 的概念对于大多数的项目而言&#xff0c;数据文件的存储是非常常见的需求&#xff0c;比如存储用户上传的头像、文件以及数据库的数据。在 Kubernetes 中&#xff0c;由于应用的部署具有高度的可扩展性和编排能力&#xff08;不像传统架构部署在固定的位置&#xff…

蚂蚁 KAG 框架开源:知识图谱 + RAG 双引擎

引言&#xff1a;从RAG到KAG&#xff0c;专业领域知识服务的技术突破 在大语言模型&#xff08;LLM&#xff09;应用落地过程中&#xff0c;检索增强生成&#xff08;RAG&#xff09; 技术通过引入外部知识库有效缓解了模型幻觉问题&#xff0c;但在专业领域仍面临三大核心挑战…

V-Ray 7.00.08 for 3ds Max 2021-2026 安装与配置教程(含语言补丁)

本文介绍 V-Ray 7.00.08 渲染器在 3ds Max 2021-2026 各版本中的安装与使用配置步骤&#xff0c;适合需要进行可视化渲染工作的设计师、建筑师及相关从业者。附带语言补丁配置方式&#xff0c;帮助用户获得更顺畅的使用体验。 &#x1f4c1; 一、安装文件准备 软件名称&#xf…

Go-Elasticsearch Typed Client查询请求的两种写法强类型 Request 与 Raw JSON

1 为什么需要两种写法&#xff1f; 在 Golang 项目中访问 Elasticsearch&#xff0c;一般会遇到两类需求&#xff1a;需求场景特点最佳写法后台服务 / 业务逻辑查询固定、字段清晰&#xff0c;需要编译期保障Request 结构体仪表盘 / 高级搜索 / 模板 DSL查询片段由前端或脚本动…

Leaflet 综合案例-聚类图层控制

看过的知识不等于学会。唯有用心总结、系统记录&#xff0c;并通过温故知新反复实践&#xff0c;才能真正掌握一二 作为一名摸爬滚打三年的前端开发&#xff0c;开源社区给了我饭碗&#xff0c;我也将所学的知识体系回馈给大家&#xff0c;助你少走弯路&#xff01; OpenLayers…

React组件中的this指向问题

在 React 组件中&#xff0c;函数定义方式影响this指向的核心原因是箭头函数与普通函数的作用域绑定规则不同&#xff0c;具体差异如下&#xff1a;​ 1. 普通函数&#xff08;function定义&#xff09;需要手动bind(this)的原因​ 当用function在组件内定义方法时&#xff1…

Vue 项目中的组件引用如何实现,依赖组件间的数据功能交互及示例演示

在 Vue 项目中&#xff0c;组件间的引用与数据交互是核心功能之一。以下是组件引用和数据交互的详细实现方式及示例&#xff1a;一、组件引用方式 1. 基本组件引用 局部注册&#xff1a;在父组件中按需引入子组件并注册。 // ParentComponent.vue import ChildComponent from .…

✨ 使用 Flask 实现头像文件上传与加载功能

文章目录&#x1f9f1; 技术栈&#x1f5c2;️ 项目结构与配置&#x1f510; 用户身份校验逻辑&#x1f4e4; 头像上传接口&#xff1a;/file/avatar/upload&#x1f4e5; 加载头像接口&#xff1a;/file/avatar/load/<filename>&#x1f9ea; 示例请求&#xff08;使用 …

去除视频字幕 5: 使用 ProPainter, 记录探索过程

使用 ProPainter 去除视频上的字幕&#xff0c;效果演示&#xff08;比之前好多了。&#xff09;。 1. 项目目标 去除视频 (bear.webm) 中的硬字幕。 2. 初始尝试与关键失败&#xff1a;IOPaint 方法: 使用 IOPaint&#xff08;一个图像修复工具&#xff09;配合 PaddleOCR 逐…

JavaScript HTTP 请求:从老古董到新潮流

前端开发离不开跟后端打交道&#xff0c;HTTP 请求就是这座桥梁。JavaScript 提供了好几种方式来发请求&#xff0c;从老牌的 XMLHttpRequest (XHR) 到现代的 Fetch API&#xff0c;再到各种好用的第三方库&#xff08;像 Axios、Ky、Superagent&#xff09;。咱们一个一个聊清…

Windows10系统使用Cmake4.1.0构建工具+Visual Studio2022编译Opencv4.11教程

安装提示 后续安装本Cmake和Opencv版本及以上都可以。Microsoft Visual Studio2022已默认安装&#xff0c;没有安装给出教程链接。 一、Cmake4.1.0下载 1.官网下载&#xff1a;https://cmake.org/download/&#xff0c;找到cmake-4.1.0-rc3-windows-x86_64.zip版本 2.压缩包…

【性能测试】Jmeter+Grafana+InfluxDB+Prometheus Windows安装部署教程

一、工具作用与整体架构 1.1 各工具核心作用 工具作用描述关键特性Jmeter性能测试工具&#xff0c;模拟多用户并发请求&#xff0c;生成测试数据支持HTTP/HTTPS、数据库等多种协议&#xff0c;可自定义测试场景InfluxDB时序数据库&#xff0c;专门存储时间序列数据&#xff0…