RabbitMQ 基本使用方法详解
RabbitMQ 基本使用方法
在你的代码中,涉及到了 RabbitMQ 的基本使用,包括队列定义、交换机的配置、消息的发送与接收等内容。下面我将详细总结 RabbitMQ 的基本使用方法,重点解释如何在 Spring Boot 项目中与 RabbitMQ 集成。
1. 引入依赖
在 Spring Boot 项目中,使用 Spring AMQP 组件来集成 RabbitMQ。首先需要在 pom.xml
中添加相关的依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>
该依赖会自动导入 Spring AMQP 库以及 RabbitMQ 的客户端,允许你在 Spring 环境下方便地使用 RabbitMQ。
2. 配置 RabbitMQ
首先,你需要配置 RabbitMQ 的相关参数(如连接信息、交换机、队列等)。在你的例子中,RabbitConfig
类就负责了这些配置。
package com.easylive.entity.config;import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitConfig {@Beanpublic MessageConverter messageConverter() {// 使用自定义的消息转换器来更严格地处理反序列化return new Jackson2JsonMessageConverter();}// 队列定义@Beanpublic Queue transferFileQueue() {return new Queue("transferFileRouting", true); // durable 确保队列持久化}@Beanpublic Queue videoPlayQueue() {return new Queue("videoPlayRouting", true);}// Direct 类型交换机@Beanpublic DirectExchange directExchange() {return new DirectExchange("directExchange", true, false); // durable,是否持久化}// 队列和交换机的绑定@Beanpublic Binding transferFileBinding(Queue transferFileQueue, DirectExchange directExchange) {return BindingBuilder.bind(transferFileQueue).to(directExchange).with("transferFileRoutingKey");}@Beanpublic Binding videoPlayBinding(Queue videoPlayQueue, DirectExchange directExchange) {return BindingBuilder.bind(videoPlayQueue).to(directExchange).with("videoPlayRoutingKey");}
}
2.1 定义队列
在 RabbitMQ 中,队列用于存储消息,直到消费者从队列中取出。队列是消息传递的基础。
@Bean
public Queue transferFileQueue() {return new Queue("transferFileRouting", true); // durable 确保队列持久化
}
Queue("transferFileRouting", true)
:创建一个名为transferFileRouting
的队列,true
表示该队列是持久化的,即 RabbitMQ 会在服务器重启后保留队列。
2.2 定义交换机
交换机(Exchange)负责接收来自生产者的消息,并根据队列绑定的规则将消息路由到相应的队列。RabbitMQ 支持不同类型的交换机(如 Direct
, Fanout
, Topic
等),在这个例子中使用的是 Direct Exchange。
@Bean
public DirectExchange directExchange() {return new DirectExchange("directExchange", true, false); // durable,是否持久化
}
DirectExchange("directExchange", true, false)
:创建一个名为directExchange
的交换机,true
表示该交换机是持久化的,false
表示不自动删除。
2.3 队列与交换机的绑定
队列和交换机之间的绑定决定了消息如何路由。在你的例子中,队列通过 Routing Key 和交换机进行绑定。
@Bean
public Binding transferFileBinding(Queue transferFileQueue, DirectExchange directExchange) {return BindingBuilder.bind(transferFileQueue).to(directExchange).with("transferFileRoutingKey");
}
BindingBuilder.bind(transferFileQueue).to(directExchange).with("transferFileRoutingKey")
:这表示将transferFileQueue
队列与directExchange
交换机进行绑定,使用transferFileRoutingKey
作为路由键。
3. 消息发送
消息生产者通过交换机发送消息到队列,消费者从队列中获取消息并处理。你在代码中的生产者部分使用了 amqpTemplate.convertAndSend
方法来发送消息,消息是发送给direct交换机,并指定key值。
for (VideoInfoFilePost filePost : addFileList) {amqpTemplate.convertAndSend("directExchange", "transferFileRoutingKey", filePost);
}amqpTemplate.convertAndSend("directExchange", "videoPlayRoutingKey", videoPlayInfoDto);
amqpTemplate.convertAndSend("directExchange", "transferFileRoutingKey", filePost)
:这表示通过交换机directExchange
,使用transferFileRoutingKey
作为路由键,发送filePost
对象到消息队列。amqpTemplate.convertAndSend
会自动序列化对象(这里使用Jackson2JsonMessageConverter
)并发送到队列。
4. 消息接收
消费者使用 @RabbitListener
注解监听队列中的消息。当队列中有消息时,消费者会触发相应的处理方法。
@RabbitListener(queues = "transferFileRouting")
public void consumeTransferFileQueue(@Payload VideoInfoFilePost videoInfoFile) {try {videoInfoPostService.transferVideoFile(videoInfoFile);} catch (Exception e) {log.error("处理转码文件队列消息失败", e);}
}
@RabbitListener(queues = "transferFileRouting")
:表示该方法会监听名为transferFileRouting
的队列。@Payload
注解用于指定消息体的类型。这里接收的是VideoInfoFilePost
类型的消息。- 消费者方法会在消息到达时被触发,执行相应的业务逻辑。
5. 消息转换
Spring AMQP 提供了 MessageConverter
接口,可以用于消息内容的转换。在你的配置中,使用了 Jackson2JsonMessageConverter
作为消息转换器,它会将消息对象转换为 JSON 格式发送,并在接收时进行反序列化。
@Bean
public MessageConverter messageConverter() {return new Jackson2JsonMessageConverter();
}
6. 完整流程总结
-
队列和交换机的定义与配置:
- 定义队列和交换机,设置持久化属性。
- 使用
Binding
将队列与交换机绑定,并指定路由键。
-
消息生产者发送消息:
- 使用
amqpTemplate.convertAndSend
发送消息到指定的交换机,并根据路由键将消息发送到特定的队列。 - 发送的消息会经过
MessageConverter
转换成 JSON 格式。
- 使用
-
消息消费者接收消息:
- 使用
@RabbitListener
注解来监听队列中的消息。 - 当消息到达时,消费者会自动触发相应的方法,并处理消息。
- 使用
-
异常处理:
- 消费者中可以加入异常处理逻辑(如
try-catch
),以确保在消息处理失败时记录日志并进行适当的处理。
- 消费者中可以加入异常处理逻辑(如
7. 注意事项
-
持久化与确认机制:
- 如果消息队列和交换机是持久化的,那么即使 RabbitMQ 重启,队列和交换机也会被保留。但这要求队列中的消息也需要持久化,否则消息会丢失。
-
事务与确认:
- Spring AMQP 提供了事务支持,可以在发送消息时确保消息的可靠性。
- 消费者可以使用
@RabbitListener
的ackMode
属性来控制消息确认机制,保证消息被成功消费后才从队列中移除。
-
消息格式与序列化:
- 使用
Jackson2JsonMessageConverter
作为默认消息转换器可以方便地进行 Java 对象与 JSON 格式的互转。
- 使用
-
死信队列与重试机制:
- RabbitMQ 支持死信队列(DLX)和消息重试机制,用于处理消费失败的消息。
总结
RabbitMQ 在 Spring Boot 中的集成非常简便,通过 @Configuration
配置类定义队列、交换机和绑定关系,生产者通过 amqpTemplate
发送消息,消费者使用 @RabbitListener
监听队列消息。结合 MessageConverter
,可以方便地进行消息的序列化和反序列化。整个流程中,队列、交换机和消息的绑定机制是核心,保证了消息的有效传递和处理。
相关文章:
RabbitMQ 基本使用方法详解
RabbitMQ 基本使用方法 在你的代码中,涉及到了 RabbitMQ 的基本使用,包括队列定义、交换机的配置、消息的发送与接收等内容。下面我将详细总结 RabbitMQ 的基本使用方法,重点解释如何在 Spring Boot 项目中与 RabbitMQ 集成。 1. 引入依赖 …...
[leetcode100] 101. 对称二叉树
https://leetcode.cn/problems/symmetric-tree/description/?envTypestudy-plan-v2&envIdtop-100-liked 心血来潮,突然感觉很久没做leetcode,刷一题。 看到“简单”,哦吼,应该很快吧。 结果真是《简单》 题目描述 给你一个…...
Vue.createApp的对象参数
目录 template 属性 data 属性 methods 属性 疑问 function 函数的两种写法 methods 属性中 this 的指向 总结 Vue 实例是通过 Vue.createApp() 创建的,该函数需要接收一个对象作为参数,该对象可添加 template、data、methods 等属性。 template …...
短信验证码burp姿势
首先声明,本文仅仅作为学习使用,因个人原因导致的后果,皆有个人承担,本人没有任何责任。 在之前的burp学习中,我们学习了图片验证码的突破,但是现实中还有很多短信验证码,在此我介绍几种短信验…...
ubuntu WPS安装
需要进入国外官网下载 [OFFICIAL] WPS Office-Free Office Download for PC & Mobile, AI-Powered Office Suite 安装 sudo dpkg -i wps-office_11.1.0.11723.XA_amd64.deb 提示缺失字体操作 下载字体包 链接: https://pan.baidu.com/s/1EVzb3F8Ry_dJ_hj0A4MksQ 提取…...
中粮凤凰里共有产权看房记
中粮凤凰里看房是希望而来,失望而归。主要是对如下失望,下述仅个人看房感受: 1. 户型不喜欢:三房的厨房和餐厅位置很奇葩 2. 样板间在25楼:湖景一言难尽和有工厂噪声 3. 精装修的交房质量:阳台的推拉门用料很草率 …...
学习笔记068——Hibernate框架介绍以及使用方法
文章目录 一、如何使用二、具体操作1、创建 Maven 工程,pom.xml2、hibernate.cfg.xml3、创建实体类4、创建实体关系映射文件5、实体关系映射文件注册到 Hibernate 的配置文件中。6、使用 Hibernate API 完成数据操作。7、pom.xml 中需要配置 resource 三、Hibernate…...
Maven 安装配置(详细教程)
文章目录 一、Maven 简介二、下载 Maven三、配置 Maven3.1 配置环境变量3.2 Maven 配置3.3 IDEA 配置 四、结语 一、Maven 简介 Maven 是一个基于项目对象模型(POM)的项目管理和自动化构建工具。它主要服务于 Java 平台,但也支持其他编程语言…...
虚幻开发中的MYPROJECTFORPLUG_API
百度网盘-免费云盘丨文件共享软件丨超大容量丨存储安全 在虚幻引擎5(Unreal Engine 5)中,以及许多其他使用C的项目中,__declspec(dllexport) 和 __declspec(dllimport) 是用来处理动态链接库(DLL)的宏定义…...
顺序栈及其实现过程
目录 一、概念 二、顺序栈 2.1顺序栈的结构模型 2.2顺序栈的实现 2.2.1创建 2.2.2判断栈是否为空 2.2.3判断栈是否为空 2.2.4入栈 2.2.5出栈 2.2.6查看栈顶 2.2.7清空栈 2.2.8释放栈 一、概念 栈是限制在某一端进行插入、删除操作的线性表,俗称堆栈&…...
内圆弧转子泵绘制工具开发
接着上期的Gerotor 泵的话题继续。最近有小伙伴找我开发一个内圆弧摆线泵的计算绘制工具,也就是把上次计算绘制的过程做成一个桌面应用工具,这样用起来会更方便、效率更高。那究竟是什么样的工具呢?一起来看看: 前面不是已经有了上…...
linux网络编程 | c | 多进程并发服务器实现
多进程并发服务器 基于该视频完成 11-多进程并发服务器思路分析_哔哩哔哩_bilibili 通过的是非阻塞忙轮询的方式实现的 和阻塞等待的区别就是,阻塞是真的阻塞了,而这个方式是一直在问有没有请求有没有请求 文章目录 多进程并发服务器1.核心思路&…...
Vins_Fusion_gpu中source setup.bash
文章目录 source setup.bashsetup.bashsetup.sh脚本的主要功能脚本的详细解释1. **初始化和检查**2. **检测操作系统**3. **设置环境变量**4. **记住 shell 类型**5. **调用 Python 脚本生成环境变量**6. **加载环境钩子**7. **清理** 总结 _setup_util.py_setup_util.py 的完整…...
怎么理解大模型推理时的Top_P参数?
本篇博客介绍一下大模型推理时的Top_P参数,Top_P与Top_K,Beamsearch,temperature 都是什么关系以及该如何选择Top_P参数。 文章目录 一、什么是Top_P参数?二、工作原理三、top_p和top_k是什么关系?四、Top_P和BeamSea…...
hive+hadoop架构数仓使用问题记录
使用问题记录 问题1:5条数据的表执行count(*)函数,很慢,43s才出结果? 该数仓的分析计算是基于hadoop的mapreduce分布式计算框架运行的,适用于大量/海量数据,少量数据,还是使用单体数据库快。也…...
前端的 Python 入门指南(三):数据类型对比 - 彻底的一切皆对象实现和包装对象异同
《前端的 Python 入门指南》系列文章: (一):常用语法和关键字对比(二):函数的定义、参数、作用域对比(三):数据类型对比 - 彻底的一切皆对象实现和包装对象异…...
Axios结合Typescript 二次封装完整详细场景使用案例
Axios 是一个基于 promise 的 HTTP 客户端,用于浏览器和 node.js。二次封装 Axios 主要是为了统一管理 HTTP 请求,例如设置统一的请求前缀、头部、超时时间,统一处理请求和响应的格式,以及错误处理等。 以下是一个使用 TypeScrip…...
基于Kubesphere实现微服务的CI/CD——部署微服务项目(三)
目录 一、kubesphere安装 1、安装本地持久存储 1.1、default-storage-class.yaml 1.2、 openebs-operator.yaml 1.3、安装 Default StorageClass 2、安装kubesphere 2.1、安装Helm 2.2、安装kubesphere 二、配置kubesphere 1、安装插件 2、创建devops项目 3、配置…...
【使用webrtc-streamer解析rtsp视频流】
webrtc-streamer WebRTC (Web Real-Time Communications) 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或&a…...
element左侧导航栏
由element组件搭建的左侧导航栏 预览: html代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>首页</title><style> /*<!-- 调整页面背景颜色-->*/body{background-colo…...
【金融贷后】贷后运营精细化管理
文章目录 一、贷后专业术语讲解① 什么是贷后,贷后部是干什么的?② 贷后部门常见组织架构?③ 贷后专业术语有哪些? 二、贷后常用作业手段介绍① 贷后产品形态介绍?② 催收常用的方法? 三、贷后策略岗位介绍…...
学习CSS第七天
学习文章目录 一.交集选择器 一.交集选择器 使用多个条件符合的元素,可提高区分的精准度 元素配合类名是使用场景最多的 (元素必须是第一位,ID一般不写) <!DOCTYPE html> <html lang"zh-CN"> <head>…...
Image Stitching using OpenCV
文章目录 简介图像拼接管道特征检测和提取特征检测特征提取 特征匹配强力匹配FLANN(近似最近邻快速库)匹配 单应性估计扭曲和混合结论 使用opencv进行图像拼接 原为url: https://medium.com/paulsonpremsingh7/image-stitching-using-opencv-a-step-by-s…...
CentOS7 安装Selenium(使用webdriver_manager自动安装ChromeDriver)
在 CentOS 7 上安装 Selenium 通常涉及几个步骤,包括安装 Python、安装 Selenium 库、安装 WebDriver 以及配置环境。以下是详细的步骤: 1. 安装 Python 和 pip 如果你的系统中还没有安装 Python 和 pip,可以使用以下命令进行安装ÿ…...
鸿蒙手机文件目录
最近在开发鸿蒙,想把文件从电脑上发送到鸿蒙上我的手机APP的根目录,但是试了几次目录都不对,最后终于找到了,在这里记录一下 鸿蒙手机路径: /storage/media/100/local/files/Docs 将文件从电脑发送到手机:hdc file s…...
泷羽Sec学习笔记-Bp中ip伪造、爬虫审计
ip伪造与爬虫审计 ip伪造 下载插件:burpFakeIP 地址:GitHub - TheKingOfDuck/burpFakeIP: 服务端配置错误情况下用于伪造ip地址进行测试的Burp Suite插件 python版需要配置jython:下载地址:Maven Central: org.python:jython-…...
电子电工一课一得
首语 在现代社会中,电子电工技术已经渗透到我们生活的方方面面,从家用电器到工业自动化,从通信设备到智能系统,无一不依赖于电子电工技术。因此,掌握电子电工的基础知识,不仅对理工科学生至关重要…...
Cesium 限制相机倾斜角(pitch)滑动范围
1.效果 2.思路 在项目开发的时候,有一个需求是限制相机倾斜角,也就是鼠标中键调整视图俯角时,不能过大,一般 pitch 角度范围在 0 至 -90之间,-90刚好为正俯视。 在网上查阅了很多资料,发现并没有一个合适的…...
配置ssh-key连接github
GitHub 通过在 2022 年 3 月 15 日删除旧的、不安全的密钥类型来提高安全性。 具体内容参考如下链接 https://docs.github.com/zh/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent mac配置 ssh-keygen -t ed25519 -C …...
Linux——进程控制模拟shell
1.进程创建 我们在之前的文章中介绍过进程创建的方法,可以通过系统调用接口fork来创建新的进程。 fork在创建完新的子进程之后,返回值是一个pid,对于父进程返回子进程的pid,对于子进程返回0。fork函数后父子进程共享代码ÿ…...
凡科做网站关键词/百度快照官网
xargs与find经常结合来进行文件操作,平时删日志的时候只是习惯的去删除,比如 # find . -type f -name "*.log" | xargs rm -rf *就将以log结尾的文件删除了,如果我想去移动或者复制就需要使用参数来代替了。 xargs -i 参数或者-I参…...
linux玩wordpress/在线域名查询网站
简单理解: 私有云是自己的房子,有钥匙的人可以进。 公有云是酒店,谁花钱给谁房卡,时间到了就退房。 公有云: 第三方提供商用户能够使用的云,一般可以通过网络连接服务器使用,成本比较低…...
医院的 建设网站的策划书/全网网络营销
我们都知道一个iOS应用的如果是在main函数中,它的实现是 int main(int argc, char * argv[]) {autoreleasepool {return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));} } 复制代码我们看到在main中有个autoreleasepool,那它到底是什么呢?让我…...
网站app制作教程/品牌广告文案
Java中的计算主要有double,float,int,long,BigDecimal1、float和double主要用户科学计算和工程计算,它们执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而设计的。然而它们并没有提供完全精确的结果,所以不应该被…...
解决wordpress主题缺少style.css无法安装的方法/谷歌seo推广培训班
一、docker是什么 1、为什么会有docker 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后…...
栖霞建设采购网站/苏州seo网站系统
我们在写灌水机器人、抓资源机器人和Web网游辅助工具的时候第一步要实现的就是用户登录。那么怎么用C#来模拟一个用户的登录拉?要实现用户的登录,那么首先就必须要了解一般网站中是怎么判断用户是否登录的。 HTTP协议是一个无连接的协议,也就…...