当前位置: 首页 > news >正文

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. 完整流程总结

  1. 队列和交换机的定义与配置

    • 定义队列和交换机,设置持久化属性。
    • 使用 Binding 将队列与交换机绑定,并指定路由键。
  2. 消息生产者发送消息

    • 使用 amqpTemplate.convertAndSend 发送消息到指定的交换机,并根据路由键将消息发送到特定的队列。
    • 发送的消息会经过 MessageConverter 转换成 JSON 格式。
  3. 消息消费者接收消息

    • 使用 @RabbitListener 注解来监听队列中的消息。
    • 当消息到达时,消费者会自动触发相应的方法,并处理消息。
  4. 异常处理

    • 消费者中可以加入异常处理逻辑(如 try-catch),以确保在消息处理失败时记录日志并进行适当的处理。

7. 注意事项

  • 持久化与确认机制

    • 如果消息队列和交换机是持久化的,那么即使 RabbitMQ 重启,队列和交换机也会被保留。但这要求队列中的消息也需要持久化,否则消息会丢失。
  • 事务与确认

    • Spring AMQP 提供了事务支持,可以在发送消息时确保消息的可靠性。
    • 消费者可以使用 @RabbitListenerackMode 属性来控制消息确认机制,保证消息被成功消费后才从队列中移除。
  • 消息格式与序列化

    • 使用 Jackson2JsonMessageConverter 作为默认消息转换器可以方便地进行 Java 对象与 JSON 格式的互转。
  • 死信队列与重试机制

    • RabbitMQ 支持死信队列(DLX)和消息重试机制,用于处理消费失败的消息。

总结

RabbitMQ 在 Spring Boot 中的集成非常简便,通过 @Configuration 配置类定义队列、交换机和绑定关系,生产者通过 amqpTemplate 发送消息,消费者使用 @RabbitListener 监听队列消息。结合 MessageConverter,可以方便地进行消息的序列化和反序列化。整个流程中,队列、交换机和消息的绑定机制是核心,保证了消息的有效传递和处理。

相关文章:

RabbitMQ 基本使用方法详解

RabbitMQ 基本使用方法 在你的代码中&#xff0c;涉及到了 RabbitMQ 的基本使用&#xff0c;包括队列定义、交换机的配置、消息的发送与接收等内容。下面我将详细总结 RabbitMQ 的基本使用方法&#xff0c;重点解释如何在 Spring Boot 项目中与 RabbitMQ 集成。 1. 引入依赖 …...

[leetcode100] 101. 对称二叉树

https://leetcode.cn/problems/symmetric-tree/description/?envTypestudy-plan-v2&envIdtop-100-liked 心血来潮&#xff0c;突然感觉很久没做leetcode&#xff0c;刷一题。 看到“简单”&#xff0c;哦吼&#xff0c;应该很快吧。 结果真是《简单》 题目描述 给你一个…...

Vue.createApp的对象参数

目录 template 属性 data 属性 methods 属性 疑问 function 函数的两种写法 methods 属性中 this 的指向 总结 Vue 实例是通过 Vue.createApp() 创建的&#xff0c;该函数需要接收一个对象作为参数&#xff0c;该对象可添加 template、data、methods 等属性。 template …...

短信验证码burp姿势

首先声明&#xff0c;本文仅仅作为学习使用&#xff0c;因个人原因导致的后果&#xff0c;皆有个人承担&#xff0c;本人没有任何责任。 在之前的burp学习中&#xff0c;我们学习了图片验证码的突破&#xff0c;但是现实中还有很多短信验证码&#xff0c;在此我介绍几种短信验…...

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 提取…...

中粮凤凰里共有产权看房记

中粮凤凰里看房是希望而来&#xff0c;失望而归。主要是对如下失望&#xff0c;下述仅个人看房感受&#xff1a; 1. 户型不喜欢&#xff1a;三房的厨房和餐厅位置很奇葩 2. 样板间在25楼&#xff1a;湖景一言难尽和有工厂噪声 3. 精装修的交房质量:阳台的推拉门用料很草率 …...

学习笔记068——Hibernate框架介绍以及使用方法

文章目录 一、如何使用二、具体操作1、创建 Maven 工程&#xff0c;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 是一个基于项目对象模型&#xff08;POM&#xff09;的项目管理和自动化构建工具。它主要服务于 Java 平台&#xff0c;但也支持其他编程语言…...

虚幻开发中的MYPROJECTFORPLUG_API

百度网盘-免费云盘丨文件共享软件丨超大容量丨存储安全 在虚幻引擎5&#xff08;Unreal Engine 5&#xff09;中&#xff0c;以及许多其他使用C的项目中&#xff0c;__declspec(dllexport) 和 __declspec(dllimport) 是用来处理动态链接库&#xff08;DLL&#xff09;的宏定义…...

顺序栈及其实现过程

目录 一、概念 二、顺序栈 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释放栈 一、概念 栈是限制在某一端进行插入、删除操作的线性表&#xff0c;俗称堆栈&…...

内圆弧转子泵绘制工具开发

接着上期的Gerotor 泵的话题继续。最近有小伙伴找我开发一个内圆弧摆线泵的计算绘制工具&#xff0c;也就是把上次计算绘制的过程做成一个桌面应用工具&#xff0c;这样用起来会更方便、效率更高。那究竟是什么样的工具呢&#xff1f;一起来看看&#xff1a; 前面不是已经有了上…...

linux网络编程 | c | 多进程并发服务器实现

多进程并发服务器 基于该视频完成 11-多进程并发服务器思路分析_哔哩哔哩_bilibili 通过的是非阻塞忙轮询的方式实现的 和阻塞等待的区别就是&#xff0c;阻塞是真的阻塞了&#xff0c;而这个方式是一直在问有没有请求有没有请求 文章目录 多进程并发服务器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参数&#xff0c;Top_P与Top_K&#xff0c;Beamsearch&#xff0c;temperature 都是什么关系以及该如何选择Top_P参数。 文章目录 一、什么是Top_P参数&#xff1f;二、工作原理三、top_p和top_k是什么关系&#xff1f;四、Top_P和BeamSea…...

hive+hadoop架构数仓使用问题记录

使用问题记录 问题1&#xff1a;5条数据的表执行count(*)函数&#xff0c;很慢&#xff0c;43s才出结果&#xff1f; 该数仓的分析计算是基于hadoop的mapreduce分布式计算框架运行的&#xff0c;适用于大量/海量数据&#xff0c;少量数据&#xff0c;还是使用单体数据库快。也…...

前端的 Python 入门指南(三):数据类型对比 - 彻底的一切皆对象实现和包装对象异同

《前端的 Python 入门指南》系列文章&#xff1a; &#xff08;一&#xff09;&#xff1a;常用语法和关键字对比&#xff08;二&#xff09;&#xff1a;函数的定义、参数、作用域对比&#xff08;三&#xff09;&#xff1a;数据类型对比 - 彻底的一切皆对象实现和包装对象异…...

Axios结合Typescript 二次封装完整详细场景使用案例

Axios 是一个基于 promise 的 HTTP 客户端&#xff0c;用于浏览器和 node.js。二次封装 Axios 主要是为了统一管理 HTTP 请求&#xff0c;例如设置统一的请求前缀、头部、超时时间&#xff0c;统一处理请求和响应的格式&#xff0c;以及错误处理等。 以下是一个使用 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) 是一项实时通讯技术&#xff0c;它允许网络应用或者站点&#xff0c;在不借助中间媒介的情况下&#xff0c;建立浏览器之间点对点&#xff08;Peer-to-Peer&#xff09;的连接&#xff0c;实现视频流和&#xff08;或&a…...

element左侧导航栏

由element组件搭建的左侧导航栏 预览: html代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>首页</title><style> /*<!-- 调整页面背景颜色-->*/body{background-colo…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...