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…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
