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

RabbitMQ个人理解与基本使用

目录

一. 作用:

二. RabbitMQ的5中队列模式:

1. 简单模式

2. Work模式

3. 发布/订阅模式

4. 路由模式

5. 主题模式

三. 消息持久化:

消息过期时间

ACK应答 

四. 同步接收和异步接收:

应用场景

五. 基本使用 :

引入依赖库:

配置文件RabbitMQConfig: 

创建消息任务类: 

解析:


一. 作用:

        RabbitMQ主要用于消息队列的实现。

二. RabbitMQ的5中队列模式:

1. 简单模式

一个生产者(发送方)对应一个消费者(接收方)

2. Work模式

一个生产者对应多个消费者,但是只能有一个消费者获得消息(排他)

3. 发布/订阅模式

一个消费者将消息首先发送到fanout交换器,交换器绑定到多个队列,然后与之对应的所有消费者都能接收到消息(不排他)

4. 路由模式

生产者将消息发送到direct交换器,交换器按照关键字(Key),把消息路由到某个队列

5. 主题模式

生产者将消息发送到Topic交换器,交换器按照复杂的规则,把消息路由到某个队列

三. 消息持久化:

        消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息可靠性的呢?答案就是消息持久化。持久化可以防止在异常情况下丢失数据。除了消息持久化之外,甚至交换器和队列都能持久化。也就是说rabbitmq的消息会被存储在磁盘上,只有当消费收到消息,rabbitmq确认消费者收到消息(Acknowledgments--简称ACK)后才会将消息从队列中删除。  

  • 消息过期时间

        如果消费者一直不接收消息,消息会一直保存在消息队列当中,短期内可能不会有什么影响,但是如果经过长时间的积累后,消息会变得很多很多 ,浪费大量的资源,内存。

        为了应对这种情况,就可以对rabbitmq设置消息的过期时间,在规定时间内消息没有被接收,就会删除掉该消息。

  • ACK应答 

        消费者接收到消息后,为了让RabbitMQ 知道,就需要返回一个ACK应答,告诉RabbitMQ消费者已经收到了消息,如果收到消息后我们需要删除该消息,只需要在ACK应答中加上deliveryTag标志位。

四. 同步接收和异步接收:

        同步接收:指消费者调用方法时,会阻塞来等待消息,直到消息被成功消费或者队列为空。(没有消息等待消息再接着处理)。

        异步接收: 指消费者不会在接收消息时阻塞,而是通过回调函数处理消息。消费者在等待消息的同时不会停下,可以处理其他任务。(当有消息时才来处理消息)。

  • 应用场景

        同步接收 :当消息的处理顺序对业务逻辑非常重要,就使用同步接收,消费者一次只处理一个消息,确保了每条消息的处理顺序。

        异步接收:当处理消息的时间比较长,或者系统的并发量大时,采用异步接收会更好。

RabbitMQ还有一个杀手锏——同时使用异步收发和同步收发。

五. 基本使用 :

引入依赖库:

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.9.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency> 

配置文件RabbitMQConfig: 

import com.rabbitmq.client.ConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {@Value("${rabbitmq.factoryHost}")private String host;@Beanpublic ConnectionFactory connectionFactory() {ConnectionFactory factory = new ConnectionFactory();factory.setHost(host);factory.setPort(5672);return factory;}
}

 host配置,我将rabbitMQ放在虚拟机上的,所有ip是虚拟机的地址:

创建消息任务类: 

@Slf4j
@Component
public class MessageTask {@Autowiredprivate ConnectionFactory factory;@Autowiredprivate MessageService messageService;/** 同步发送消息* */public void send(String topic, MessageEntity entity) {//向MongoDB保存消息数据,返回消息IDString id = messageService.insertMessage(entity);//向RabbitMQ发送消息try(Connection connection = factory.newConnection();Channel channel = connection.createChannel()){//连接到某个topicchannel.queueDeclare(topic, true, false, false, null);HashMap header = new HashMap();header.put("messageId",id);//创建AMQP协议参与对象,添加附加属性AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().headers(header).build();channel.basicPublish("",topic,properties,entity.getMsg().getBytes());log.debug("消息发送成功");} catch (Exception e){log.error(e.getMessage());throw new EmosException("向MQ发送消息失败");}}/** 异步发送消息* */@Async("AsyncTaskExecutor")public void sendAsync(String topic, MessageEntity entity) {send(topic, entity);}/** 同步接收消息* */public int receive(String topic) {int i = 0;try (//接收消息数据Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 从队列中获取消息,不自动确认channel.queueDeclare(topic, true, false, false, null);//Topic中有多少条数据未知,所以使用死循环接收数据,直到接收不到消息,退出死循环while (true) {//创建响应接收数据,禁止自动发送Ack应答GetResponse response = channel.basicGet(topic, false);if (response != null) {AMQP.BasicProperties properties = response.getProps();Map<String, Object> header = properties.getHeaders(); //获取附加属性对象String messageId = header.get("messageId").toString();byte[] body = response.getBody();//获取消息正文String message = new String(body);log.debug("从RabbitMQ接收的消息:" + message);MessageRefEntity entity = new MessageRefEntity();entity.setMessageId(messageId);entity.setReceiverId(Integer.parseInt(topic));entity.setReadFlag(false);entity.setLastFlag(true);messageService.insertRef(entity); //把消息存储在MongoDB中//数据保存到MongoDB后,才发送Ack应答,让Topic删除这条消息long deliveryTag = response.getEnvelope().getDeliveryTag();channel.basicAck(deliveryTag, false);i++;} else {break; //接收不到消息,则退出死循环}}} catch (Exception e) {log.error("执行异常", e);}return i;}/** 异步接收消息* */@Asyncpublic int receiveAsync(String topic) {return receive(topic);}/** 同步删除消息* */public void deleteQueue(String topic) {try(//接收消息数据Connection connection = factory.newConnection();Channel channel = connection.createChannel()){channel.queueDelete(topic);log.debug("成功删除消息队列:"+topic);} catch (Exception e){log.error("删除消息队列失败:",e);throw new EmosException("删除消息队列失败");}}/** 异步删除消息* */@Asyncpublic void deleteAsync(String topic) {deleteQueue(topic);}
}

解析:

channel.queueDeclare(String queueName, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments);
  • queueName:队列的名称,用于标识消息的存储位置。
  • durable:

        true,表示队列是持久化的。

        false,表示队列是非持久化的。

  • exclusive:

        true:队列仅供当前连接使用,连接断开时队列会自动删除。

        false:队列可供多个连接共享。

  • autoDelete:
    true:当队列不再被任何消费者订阅时,队列会自动删除。
    false:队列即使没有消费者订阅也会一直存在,直到手动删除。

  • arguments:额外的参数,null表示没有额外参数

Map<String, Object> arguments = new HashMap<>();
arguments.put("x-message-ttl", 60000); // 设置队列中消息的过期时间为 60 秒(60000 毫秒)

channel.queueDeclare("myQueue", true, false, false, arguments);

相关文章:

RabbitMQ个人理解与基本使用

目录 一. 作用&#xff1a; 二. RabbitMQ的5中队列模式&#xff1a; 1. 简单模式 2. Work模式 3. 发布/订阅模式 4. 路由模式 5. 主题模式 三. 消息持久化&#xff1a; 消息过期时间 ACK应答 四. 同步接收和异步接收&#xff1a; 应用场景 五. 基本使用 &#xff…...

Python球球大作战

系列文章 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…...

入侵他人电脑,实现远程控制(待补充)

待补充 在获取他人无线网网络密码后&#xff0c;进一步的操作是实现入侵他人电脑&#xff0c;这一步需要获取对方的IP地址并需要制作自己的代码工具自动化的开启或者打开对方的远程访问权限。 1、获取IP地址&#xff08;通过伪造的网页、伪造的Windows窗口、hook&#xff0c;信…...

数据分析实战—IMDB电影数据分析

1.实战内容 1.加载数据到movies_df&#xff0c;输出前5行&#xff0c;输出movies_df.info(),movies_df.describe() # &#xff08;1&#xff09;加载数据集&#xff0c;输出前5行 #导入库 import pandas as pd import numpy as np import matplotlib import matplotlib.pyplo…...

Google guava 最佳实践 学习指南之08 `BiMap`(双向映射)

guava 最佳实践 学习指南 Google Guava 库中的 BiMap&#xff08;双向映射&#xff09;是一种特殊的映射类型&#xff0c;它维护了映射的反向视图&#xff0c;并确保不存在重复值&#xff0c;且始终可以安全地使用值获取对应的键。以下是关于 Guava BiMap 的一些介绍和用法&am…...

【设计模式】空接口

&#xff08;空&#xff09;接口的用法总结 接口用于定义某个类的特定能力或特性。在工作流或任务管理系统中&#xff0c;接口可以帮助标识哪些任务可以在特定阶段执行。通过实现这些接口&#xff0c;任务类可以被标识为在相应的阶段可以执行&#xff0c;从而在验证和执行逻辑…...

Grad-CAM-解释CNN决策过程的可视化技术

Grad-CAM&#xff08;Gradient-weighted Class Activation Mapping&#xff09;是一种用于解释卷积神经网络&#xff08;CNN&#xff09;决策过程的可视化技术。其核心思想是通过计算分类分数相对于网络确定的卷积特征的梯度&#xff0c;来识别图像中哪些部分对分类结果最为重要…...

前后端学习中本周遇到的内容

一、RequiresPermissions注解 例如&#xff1a; RequiresPermissions("demo:staff:save") void saveStaff(); 权限控制&#xff0c;要求含有demo:staff:save的权限才能执行方法saveStaff()。 二、遇到的细节问题 在进行增删改查时&#xff0c;发送http请求时&…...

基于海思soc的智能产品开发(巧用mcu芯片)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于开发车规级嵌入式软件的同学来说&#xff0c;socmcu这样的组合&#xff0c;他们并不陌生。但是传统的工业领域&#xff0c;比如发动机、医疗或…...

批量DWG文件转dxf(CAD图转dxf)——c#插件实现

此插件可将指定文件夹及子文件夹下的dwg文件批量转为dxf文件。 &#xff08;使用方法&#xff1a;命令行输入 “netload” 加载插件&#xff0c;然后输入“dwg2dxf”运行&#xff0c;选择文件夹即可。&#xff09; 生成dxf在此新建的文件夹路径下&#xff0c;包含子文件夹内的…...

flask flask-socketio创建一个网页聊天应用

应用所需环境&#xff1a; python 3.11.11 其他 只需要通过这个命令即可 pip install flask3.1.0 Flask-SocketIO5.4.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 最好是用conda创建一个新的虚拟环境来验证 完整的pip list如下 Package Version ----…...

使用CNN模型训练图片识别(键盘,椅子,眼镜,水杯,鼠标)

首先是环境&#xff1a; 我是在Anaconda3中的Jupyter Notebook (tensorflow)中进行训练&#xff0c;环境各位自行安装 数据集&#xff1a; 本次数据集五个类型&#xff08;键盘&#xff0c;椅子&#xff0c;眼镜&#xff0c;水杯&#xff0c;鼠标&#xff09;我收集了每个接近两…...

Gitlab 数据备份全攻略:命令、方法与注意事项

文章目录 1、备份命令2、备份目录名称说明3、手工备份配置文件3.1 备份配置文件3.2 备份ssh文件 4、备份注意事项4.1 停止puma和sicdekiq组件4.2 copy策略需要更多磁盘空间 5、数据备份方法5.1 docker命令备份5.2 kubectl命令备份5.3 参数说明5.4、选择性备份5.5、非tar备份5.6…...

Vue|scoped样式

在 Vue.js 中&#xff0c;scoped 是一个非常有用的特性&#xff0c;允许你将样式限制在当前组件的作用域内&#xff0c;避免样式泄漏到其他组件。它是通过 Vue 的单文件组件&#xff08;.vue 文件&#xff09;中的 <style> 标签实现的。 目录 案例演示创建多个vue文件如何…...

eBPF试一下(TODO)

eBPF程序跟踪linux内核软中断 eBPF (Extended Berkeley Packet Filter) 是一种强大的 Linux 内核技术&#xff0c;最初用于网络数据包过滤&#xff0c;但现在它已经扩展到了多个领域&#xff0c;如性能监控、安全性、跟踪等。eBPF 允许用户在内核中执行代码&#xff08;以一种安…...

【数据安全】如何保证其安全

数据安全风险 数字经济时代&#xff0c;数据已成为重要的生产要素。智慧城市、智慧政务的建设&#xff0c;正以数据为核心&#xff0c;推动城市管理的智能化和公共服务的优化。然而&#xff0c;公共数据开放共享与隐私保护之间的矛盾日益凸显&#xff0c;如何在确保数据安全的…...

[创业之路-196]:华为成功经验的总结与教训简单总结

目录 前言&#xff1a; 成功经验 教训归纳 前言&#xff1a; 华为作为世界领先的通信设备制造商&#xff0c;其成功经验与教训值得深入探讨。 以下是对华为成功经验的总结与教训的归纳&#xff1a; 成功经验 战略定位明确&#xff1a; 华为始终坚持“死死抓住核心技术”…...

使用 NVIDIA DALI 计算视频的光流

引言 光流&#xff08;Optical Flow&#xff09;是计算机视觉中的一种技术&#xff0c;主要用于估计视频中连续帧之间的运动信息。它通过分析像素在时间维度上的移动来预测运动场&#xff0c;广泛应用于目标跟踪、动作识别、视频稳定等领域。 光流的计算传统上依赖 CPU 或 GP…...

【UE5】pmx导入UE5,套动作。(防止“气球人”现象。

参考视频&#xff1a;UE5Animation 16: MMD模型與動作導入 (繁中自動字幕) 问题所在&#xff1a; 做法记录&#xff08;自用&#xff09; 1.导入pmx&#xff0c;删除这两个。 2.转换给blender&#xff0c;清理节点。 3.导出时&#xff0c;内嵌贴图&#xff0c;选“复制”。 …...

vue预览和下载 pdf、ppt、word、excel文档,文件类型为链接或者base64格式或者文件流,

** 方法1&#xff1a;word、xls、ppt、pdf 这些文件&#xff0c; 如果预览的文件是链接可以直接打开&#xff0c;可用微软官方的预览地址 ** <iframe width"100%" :src"textVisibleURl " id"myFramePPT" style"border: none;backgroun…...

水介导软模板 COF|MS 模拟细节全拆解

#MaterialsStudio #COF 模拟 #Nature 子刊 #科研干货 #分子模拟&#x1f525;Nature 子刊 COF 重磅突破&#xff01;四川大学团队首次用软模板法做出有序分级孔 COF里面的 Materials Studio 模拟部分写得超规范新手做 COF 晶体模拟直接抄作业&#x1f447;✅ 模拟工具与核心方法…...

如何快速掌握raylib游戏开发:面向初学者的完整实践指南

如何快速掌握raylib游戏开发&#xff1a;面向初学者的完整实践指南 【免费下载链接】raylib A simple and easy-to-use library to enjoy videogames programming 项目地址: https://gitcode.com/GitHub_Trending/ra/raylib 你是否曾梦想过开发自己的游戏&#xff0c;却…...

NoFences:彻底告别混乱桌面的免费开源分区神器

NoFences&#xff1a;彻底告别混乱桌面的免费开源分区神器 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否每天面对杂乱无章的Windows桌面感到焦虑&#xff1f;在几十个…...

告别重装系统!在Ubuntu 22.04上从零到一搞定ROS2 Humble(附小乌龟测试)

告别重装系统&#xff01;在Ubuntu 22.04上从零到一搞定ROS2 Humble&#xff08;附小乌龟测试&#xff09; 每次看到论坛里"ROS2请用Ubuntu 20.04"的推荐&#xff0c;我都忍不住想&#xff1a;难道新系统就注定与机器人开发无缘&#xff1f;去年我将工作站升级到22.0…...

Adobe-GenP 3.0:解锁Adobe全家桶功能的5分钟终极指南 [特殊字符]

Adobe-GenP 3.0&#xff1a;解锁Adobe全家桶功能的5分钟终极指南 &#x1f680; 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP 3.0是一款强大的Adobe C…...

三步解锁九大网盘高速下载:LinkSwift终极直链解析教程

三步解锁九大网盘高速下载&#xff1a;LinkSwift终极直链解析教程 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...

The Most Dangerous Writing App 快速入门指南:如何在5秒内开始高效写作

The Most Dangerous Writing App 快速入门指南&#xff1a;如何在5秒内开始高效写作 【免费下载链接】themostdangerouswritingapp If you stop typing for more than five seconds, all progress will be lost. 项目地址: https://gitcode.com/gh_mirrors/th/themostdangero…...

3分钟解锁WeMod高级功能:Wand-Enhancer完全指南,免费获得Pro体验

3分钟解锁WeMod高级功能&#xff1a;Wand-Enhancer完全指南&#xff0c;免费获得Pro体验 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 你是否曾经想过…...

Galaxea R1仿人机器人硬件架构与控制系统解析

1. Galaxea R1机器人硬件架构解析Galaxea R1是一款专为家庭服务场景设计的仿人机器人平台&#xff0c;其硬件系统经过精心设计以满足复杂环境下的操作需求。作为机器人领域的从业者&#xff0c;我在实际测试中发现这套硬件架构在负载能力、运动灵活性和环境感知三个关键维度上达…...

Midjourney V6啤酒标签设计实战:3步生成高转化率精酿包装,附可复用Prompt模板

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney V6啤酒标签设计实战&#xff1a;3步生成高转化率精酿包装&#xff0c;附可复用Prompt模板 精准定义品牌视觉语义 Midjourney V6 对文本理解显著增强&#xff0c;需将抽象品牌调性转化为可解…...