5、Spring Boot 3.x 集成 RabbitMQ
一、前言
本篇主要是围绕着 Spring Boot 3.x 与 RabbitMQ 的集成,这边文章比较简单,RabbitMQ 的集成没有太大的变化,这篇文章主要是为了后续的 RabbitMQ 的动态配置做铺垫。
1、Docker 安装 RabbitMQ
2、Spring Boot 3.x 集成 RabbitMQ
二、Docker 安装 RabbitMQ
1、创建docker-network
# 创建docker网络,方便后续连通多个容器
docker network create local-net
2、拉取镜像并启动容器
# 搜索 rabbitmq 相关镜像
docker search rabbitmq
# 指定版本拉取 rabbitmq 镜像
docker pull rabbitmq:3-management
# 查看本地镜像
docker images# 启动容器命令
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v /Users/kenny/docker/rabbitmq/data:/var/lib/rabbitmq/mnesia --network=local-net rabbitmq:3-management# 查看启动容器
docker ps# 查看启动日志
docker logs -f rabbitmq# 浏览器进入rabbitmq控制台
# http://localhost:15672
# 默认账号: guest
# 默认密码: guest
三、Spring Boot 3.x 集成 RabbitMQ
1、pom.xml
<!-- RabbitMQ --><!-- Spring Boot RabbitMQ Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
2、application.yml
spring:# RabbitMQ配置rabbitmq:host: localhostport: 5672username: guestpassword: guestlistener:simple:# 手动确认模式acknowledge-mode: manualretry:# 开启重试enabled: true# 最大重试次数max-attempts: 5# 首次重试时间间隔initial-interval: 1000# 重试时间间隔递增max-interval: 10000
3、初始化Exchange、Queue
RabbitFountConfig.java
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @program: chain* @description: RabbitMQ Fount 配置类* @author: Kenny.Qiu* @create: 2024/10/12 08:59*/
@Configuration
public class RabbitFountConfig {// exchangepublic final static String DEFAULT_EXCHANGE = "exchange.fount";// queuepublic final static String DEFAULT_QUEUE = "queue.fount";// routing keypublic final static String DEFAULT_ROUTING_KEY = "routing.key.fount";/*** 声明注册 fanout 模式的交换机** @return 交换机*/@Beanpublic FanoutExchange defalutFanoutExchange() {// durable:是否持久化,默认是false// autoDelete:是否自动删除return new FanoutExchange(DEFAULT_EXCHANGE, true, false);}/*** 声明队列** @return Queue*/@Beanpublic Queue defaultQueue() {// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效// exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable// autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除return new Queue(DEFAULT_QUEUE, true);}/*** 声明绑定交换机与队列** @return Binding*/@Beanpublic Binding defaultBinding() {return BindingBuilder.bind(defaultQueue()).to(defalutFanoutExchange());}
}
4、接收者
DefaultDirectReceiveQueueService
import com.chain.air.rpp.exchange.config.rabbit.RabbitDirectConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;/*** @program: chain* @description: 默认 direct 队列接收组件* @author: Kenny.Qiu* @create: 2024/10/12 10:04*/
@Slf4j
@Component
@RabbitListener(queues = RabbitDirectConfig.DEFAULT_QUEUE)
public class DefaultDirectReceiveQueueService {/*** 默认 direct 队列接收消息** @param message 消息内容*/@RabbitHandlerpublic void messageReceive(String message) {log.info("默认 direct 队列接收消息:{}", message);}
}
5、发送者
RabbitProducerService
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;/*** @className: RabbitProducerService* @program: chain* @description: RabbitMQ 生产者 Service 组件* @author: kenny* @create: 2024-10-04 01:11* @version: 1.0.0*/
@Slf4j
@Service
public class RabbitProducerService {@Resourceprivate RabbitTemplate rabbitTemplate;/*** 向动态创建的队列发送消息** @param queueName 队列名称* @param message 消息内容*/public void sendMessageToQueue(String queueName, String message) {log.info("向队列:{},发送消息:{}", queueName, message);rabbitTemplate.convertAndSend(queueName, message);}/*** 向动态创建的交换机发送消息** @param exchangeName 交换机名称* @param routingKey 路由键* @param message 消息内容*/public void sendMessageToExchange(String exchangeName, String routingKey, String message) {log.info("向交换机:{},路由键:{},发送消息:{}", exchangeName, routingKey, message);rabbitTemplate.convertAndSend(exchangeName, routingKey, message);}
}
6、Controller
RabbitController.java
import com.chain.air.rpp.exchange.rabbit.RabbitProducerService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** @className: RabbitController* @program: chain* @description: RabbitMQ Controller组件* @author: kenny* @create: 2024-10-03 22:02* @version: 1.0.0*/
@RestController
@RequestMapping("/rabbit")
public class RabbitController {/*** RabbitMQ 生产者 Service 组件*/@Resourceprivate RabbitProducerService rabbitProducerService;/*** 发送消息到指定的队列** @param queueName 队列名称* @param message 消息内容* @return 处理结果*/@RequestMapping("/send")public String sendMessage(@RequestParam String queueName, @RequestParam String message) {rabbitProducerService.sendMessageToQueue(queueName, message);return "向队列:" + queueName + ",发送消息:" + message;}/*** 发送消息到指定的交换机** @param exchangeName 交换机名称* @param routingKey 路由键* @param message 消息内容* @return 处理结果*/@RequestMapping("/send/exchange")public String sendMessageToExchange(@RequestParam String exchangeName, @RequestParam String routingKey, @RequestParam String message) {rabbitProducerService.sendMessageToExchange(exchangeName, routingKey, message);return "向交换机:" + exchangeName + ",发送消息:" + message;}
}
四、测试
1、启动服务
2、查看RabbitMQ控制台,Exchange、Queue是否完成创建
3、通过接口发送消息
4、通过RabbitMQ控制台,往Exchange、Queue分别发送消息,服务是否接收到
下一篇:6、Spring Boot 3.x集成RabbitMQ动态交换机、队列
相关文章:

5、Spring Boot 3.x 集成 RabbitMQ
一、前言 本篇主要是围绕着 Spring Boot 3.x 与 RabbitMQ 的集成,这边文章比较简单,RabbitMQ 的集成没有太大的变化,这篇文章主要是为了后续的 RabbitMQ 的动态配置做铺垫。 1、Docker 安装 RabbitMQ 2、Spring Boot 3.x 集成 RabbitMQ二、D…...

ENSP搭建基础网络拓扑图
一、ENSP的基本操作 1、配置网关 进入系统视图与退出 <Huawei>system-view [Huawei]quit 进入G0/0/0接口后配置ip [R1]interface GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 24查询所有接口的ip配置 [R1]display ip interface brief…...

尚硅谷rabbitmq 2024 消息可靠性答疑二 第22节
returnedMessage()只有失败才调用,confirm()成功失败了都会调用,为什么? 在RabbitMQ中,消息的确认和返回机制是为了确保消息的可靠传递和处理。confirm和returnedMessage方法的调用时机和目的不同,因此它们的行为也有…...

在 Ubuntu 上安装 Whisper 支撑环境(ffmpeg、PyTorch)的教程(2024亲测可用)
在 Ubuntu 上安装 Whisper 的教程 以下是如何在 Ubuntu 系统上安装 Whisper 以进行视频转录的详细步骤。 步骤 1:更新系统 首先更新你的 Ubuntu 系统,确保安装最新的软件包: sudo apt update && sudo apt upgrade -y步骤 2&#…...

vue+echarts实现雷达图及刻度标注
文章目录 前言代码实现实现效果总结 前言 最近项目有做数据可视化 大屏 不免再次使用些echarts应用 记录下其中echarts雷达图的实现 代码实现 先上代码 <template><div class"container"><div ref"chart" style"width: 500px; heig…...

【进阶OpenCV】 (9)--摄像头操作--->答题卡识别改分项目
文章目录 项目:答题卡识别改分1. 图片预处理2. 描绘轮廓3. 轮廓近似4. 透视变换5. 阈值处理6. 找每一个圆圈轮廓7. 将每一个圆圈轮廓排序8. 找寻所填答案,比对正确答案8.1 思路8.2 图解8.3 代码体现 9. 计算正确率 总结 项目:答题卡识别改分 …...

实时从TDengine数据库采集数据到Kafka Topic
实时从TDengine数据库采集数据到Kafka Topic 一、认识TDengine二、TDengine Kafka Connector三、什么是 Kafka Connect?四、前置条件五、安装 TDengine Connector 插件六、启动 Kafka七、验证 kafka Connect 是否启动成功八、TDengine Source Connector 的使用九、添…...

Linux -- 初识动静态库
目录 为什么要有库? 静态库 什么是静态库? 特点 优点 缺点 动态库 什么是动态库? 优点 缺点 编译器会选择哪个库? 为什么要有库? 库的存在是为了提高软件开发的效率、促进代码复用以及简化维护工作。通过使用…...

vite 打包前请求接口和打包后的不一致
在使用 Vite 进行项目打包时,如果发现打包前请求接口和打包后的行为不一致,这可能是由于多种原因导致的。以下是一些可能的原因和相应的解决方案: 1. 代理配置问题 开发环境:在开发环境中,Vite 通常使用 vite.config…...

fairseq 安装包python
背景: Collecting fairseq Using cached https://pypi.tuna.tsinghua.edu.cn/packages/d7/0f/b7043b451a97eb9b4cfb1b1e23e567b947d9d7bca542403228bd53b435fe/fairseq-0.12.1.tar.gz (9.6 MB) Installing build dependencies ... done Getting requirements…...

使用Mockaroo生成测试数据
使用Mockaroo生成测试数据 最近在学习【Spring Boot & React】Spring Boot和React教程视频的P51.Generating 1000 students一课中,看到了https://www.mockaroo.com/网站可以用来模拟生成测试数据,觉得还不错,特此记录一下。感觉每次看老…...

使用频率最高的 opencv 基础绘图操作 - python 实现
以下是 opencv-python 基本操作绘制示例,绘制: 1)圆,2)矩形,3)线段,4)文本。 安装 opencv-python pip install opencv-python 在图上绘制圆的操作,示例如…...

Python 在Excel中添加数据条
在Excel中添加数据条是一种数据可视化技巧,它通过条形图的形式在单元格内直观展示数值的大小,尤其适合比较同一列或行中各个单元格的数值。这种表示方式可以让大量的数字信息一目了然。本文将介绍如何使用Python在Excel中的指定单元格区域添加数据条。 …...

Unity中搜索不到XR Interaction Toolkit包解决方法
问题: 针对Unity版本2020.3在中PackageManager可能搜素不到XR Interaction Toolkit包 在Package Manager中未显示XR Interaction Toolkit包 解决方法: Package manager左上角,点加号,选择 Add package from git URL..,…...

【前端】JQ验证每个单选按钮是否已经选择
验证每个单选题是否都已经选择,其中每个input中不带name值,直接遍历input[type"radio"]验证 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewpor…...

【无人机设计与控制】滑模控制、反步控制、传统PID四旋翼无人机轨迹跟踪控制仿真
摘要 本文基于滑模控制、反步控制和传统PID控制,设计了针对四旋翼无人机的轨迹跟踪控制系统。通过对比这三种控制策略在四旋翼无人机轨迹跟踪中的表现,分析了各自的优缺点和适用场景。仿真结果表明,滑模控制具有更强的鲁棒性,反步…...

MongoDB 介绍
一、MongoDB 介绍 MongoDB 是一个开源的、面向文档的数据库管理系统。它采用了灵活的数据模型,以类似 JSON 的文档形式存储数据,具有高可扩展性、高性能和丰富的功能。 主要特点包括: 灵活的数据模型:文档型数据库允许存储不同…...

计算机网络:物理层 —— 物理层概述
文章目录 物理层功能物理层接口特性常见特性 相关概念 物理层(Physical Layer)是OSI(Open Systems Interconnection)模型的第一层,负责提供原始比特流传输的服务。它定义了硬件接口的电气、机械、功能和过程特性&#…...

HTTP的工作原理
HTTP(Hypertext Transfer Protocol)是一种用于在计算机网络上传输超文本数据的应用层协议。它是构成万维网的基础之一,被广泛用于万维网上的数据通信。(超文本(Hypertext)是用超链接的方法,将各种不同空间的文字信息组…...

缓存数据减轻服务器压力
问题:不是所有的数据都需要请求后端的 不是所有的数据都需要请求后端的,有些数据是重复的、可以复用的解决方案:缓存 实现思路:每一个分类为一个key,一个可以下面可以有很多菜品 前端是按照分类查询的,所以我们需要通过分类来缓存缓存代码 /*** 根据分类id查询菜品** @pa…...

【自动驾驶】控制算法(十二)横纵向综合控制 | 从理论到实战全面解析
写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…...

Python基础之List列表用法
1、创建列表 names ["张三","李四","王五","Mary"] 2、列表分片 names[1]:获取数组的第2个元素。 names[1:3]:获取数组的第2、第3个元素。包含左侧,不包含右侧。 names[:3]等同于names[0:3]&…...

视觉检测开源库-功能包框架搭建
chapt9/chapt9_ws/src,接着在目录下新建 yolov5_ros2 功能包,并添加相关依赖,完整命令如下: ros2 pkg create yolov5_ros2 --build-type ament_python --dependencies rclpy yolov5 cv_bridge sensor_msgs vision_msgs cv2 --lic…...

pytest的基础入门
pytest判断用例的成功或者失败 pytest识别用例失败时会报AssertionError或者xxxError错误,当捕获异常时pytest无法识别到失败的用例 pytest的fixture夹具 pytest的参数化 #coding:utf-8 import pytestfrom PythonProject.pytest_test.funcs.guess_point import ge…...

(31)非零均值信号的时域分析:均值、方差、与功率
文章目录 前言一、使用MATLAB生成余弦波并画图二、计算信号的均值、方差、与功率三、结果分析 前言 本文对叠加了直流分量的一段整周期余弦信号进行时域分析,使用MATLAB进行信号生成,并计算其均值、方差、与功率。最后给出对计算结果的分析,…...

架设传奇SF时提示此服务器满员,GEE引擎点开始游戏弹出服务器满员的解决方法
昨天一个朋友在架设GEE的传奇服务端时遇到一个奇怪的问题,就是在服务器外网架设时,建好角色点开始游戏提示此服务器满员,这个问题一般比较少见,而且出现的话一般都是GEE引擎的版本。 他折腾了半天,一直没进游戏&#x…...

QT day06
在QT使用数据库实现学生管理系统 头文件: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlRecord> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAME…...

微信小程序-npm支持-如何使用npm包
文章目录 1、在内建终端中打开2、npm init -y3、Vant Weapp4、通过 npm 安装5、构建 npm 1、在内建终端中打开 Windows PowerShell 版权所有 (C) Microsoft Corporation。保留所有权利。尝试新的跨平台 PowerShell https://aka.ms/pscore6PS C:\Users\dgq\WeChatProjects\minip…...

Spring Cloud Stream 3.x+kafka 3.8整合
Spring Cloud Stream 3.xkafka 3.8整合,文末有完整项目链接 前言一、如何看官方文档(有深入了解需求的人)二、kafka的安装tar包安装docker安装 三、代码中集成创建一个测试topic:testproducer代码producer配置(配置的格式,上篇文章…...

JavaScript中的数组
1.数组的概念 数组可以把一组相关的数据一起存放,并提供方便的访问/获取方式数组是指一组数据的集合,其中每个数据称之为元素(element),在数组中可以存放任意类型的元素,数组是一种将一组数据存储在单个变量名下的优雅方式。 2.…...