RabbitMQ 系列教程
一、RabbitMQ 部署及配置详解(集群部署)
二、RabbitMQ 部署及配置详解 (单机)
三、RabbitMQ 详解及实例(含错误信息处理)
四、RabbitMq死信队列及其处理方案
五、RabbitMQ Java开发教程—官方原版
六、RabbitMQ Java开发教程(二)—官方原版
七、RabbitMQ Java开发教程(三)—官方原版_

一、RabbitMQ 核心概念
1. 生产者和消费者
Producer: 消息的生产者,用于发布消息;
Consumer: 消息的消费者,用于从队列中获取消息.消费者只需关注队列即可,不需要关注交换机和路由键。消费者可以通过basicConsume(订阅模式可以从队列中一直持续的自动的接收消息)或者basicGet(先订阅消息,然后获取单条消息,再然后取消订阅。也就是说basicGet一次只能获取一条消息,如果还想再获取下一条还要再次调用basicGet)来从队列中获取消息。
2. RabbitMQ broker 服务器
RabbitMQ broker: 官方定义"RabbitMQ isn’t a food truck, it’s a delivery service",指明RabbitMQ是一种传输服务。
3. ExChange 交换机
Exchange: 生产者会将消息发送到交换机,然后交换机通过路由策略(规则)将消息路由到匹配的队列中去。ExchangeType决定了Exchange路由消息的行为,在RabbitMQ中,ExchangeType有direct、Fanout、Topic和Header 4种。Exchange 类似于数据通信网络中的交换机,提供消息路由策略。
在RabbitMQ 中,Producer 不是通过信道直接将消息发送给 Queue,而是先发送给 ExChange. 一个 ExChange 可以和多个 Queue 进行绑定,Producer 在传递消息的时候,会传递一个 ROUTING_KEY, ExChange 会根据这个 ROUTING_KEY 按照特定的路由算法,将消息路由给指定的 Message Queue。与 Queue 一样, ExChange 也可设置为持久化,临时或者自动删除。
4. Binding 绑定
所谓绑定就是将一个特定的 ExChange 和一个特定的 Queue 绑定起来,所以Binding不是一个概念,而是一种操作。RabbitMQ中通过绑定,以路由键作为桥梁将Exchange与Queue关联起来()Exchange—>Routing Key—>Queue,这样RabbitMQ就知道如何正确地将消息路由到指定的队列了,通过queueBind()方法将Exchange、Routing Key、Queue绑定起来.ExChange 和 Queue 的绑定可以是多对多的关系。
5. Binding Key 绑定键
Binding Key: 它表示的是Exchange与Message Queue是通过binding key进行绑定联系的,这个关系是固定的。初始化的时候,我们就会建立该队列。
6. Routing Key 路由键
Routing Key: 它是一个String值,用于定义路由规则。生产者在将消息发送给Exchange的时候,一般会指定一个routing key,来指定这个消息的路由规则。在队列绑定的时候需要指定路由键,在生产者发布消息的时候需要指定路由键,当消息的路由键和队列绑定的路由键匹配时,消息就会发送到该队列。
7. Message Queue 消息队列
用于存储消息的容器,可以看成一个有序的数组,生产者生产的消息会发送到交换机中,最终交换机将消息存储到某个或某些队列中。队列可被消费者订阅,消费者从订阅的队列中获取消息。
Message Queue: 消息队列,我们发送给RabbitMQ的消息最后都会到达各种queue,并且存储在其中(如果路由找不到相应的queue则数据会丢失),等待消费者来取.
消息队列提供了 FIFO 的处理机制,具有缓存消息的能力.在RabbitMQ 中,队列消息可以设置为持久化,临时或者自动删除.
设置为持久化的队列,Queue 中的消息会在 Server 本地硬盘存储一份,防止系统 Crash,数据丢失;
设置为临时的队列,Queue 中的数据在系统重启之后就会丢失;
设置为自动删除的队列,当没有用户连接到 Server,队列中的数据会被自动删除。
8. Virtual Host 虚拟主机
每一个RabbitMQ服务器都能创建多个虚拟消息服务器,我们称之为虚拟主机.每一个vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的交换机、队列、绑定等,拥有自己的权限机制.vhost相对于RabbitMQ就像虚拟机之于物理机一样.他们通过在各个实例间提供逻辑上的分离,允许不同的应用程序安全保密的运行数据,这很有用,它既能将同一个Rabbit的众多客户区分开来,又可以避免队列和交换器的命名冲突.RabbitMQ提供了开箱即用的默认的虚拟主机“/”,如果不需要多个vhost可以直接使用这个默认的vhost,通过使用缺省的guest用户名和guest密码来访问默认的vhost.
vhost之间是相互独立的,这避免了各种命名的冲突,就像App中的沙盒的概念一样,每个沙盒是相互独立的,且只能访问自己的沙盒,以保证非法访问别的沙盒带来的安全隐患.
二、RabbitMQ部署
rabbitmq部署有三种模式:单机模式,普通集群模式,镜像集群模式
RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现
1、安装erlang环境
由于rabbitmq是基于erlang语言开发的,所以必须先安装erlang。
wget http://erlang.org/download/otp_src_20.0.tar.gz
tar -zxvf otp_src_20.0.tar.gz
cd otp_src_20.0
./configure --prefix=/usr/local/erlang --without-javac
make
make install
加入环境变量
vim /etc/profile
在最后添加:
export ERLANG_HOME=/usr/local/erlang
export PATH=$PATH:/usr/local/erlang/bin
运行以下命令,使环境变量立即生效
source /etc/profile
验证erl是否成功安装
erl
2、单机模式安装
安装 rabbitmq
可以去官网手动下载(Downloading and Installing RabbitMQ — RabbitMQ)也可以通过wget命令下载
cd /opt
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.11.6/rabbitmq-server-3.11.6.tar.xz
xz -d rabbitmq-server-generic-unix-3.11.6.tar.xz
tar -xvf rabbitmq-server-generic-unix-3.6.10.tar
cp -r /opt/rabbitmq_server-3.6.10 /usr/local/rabbitmq
注:该方式安装的RabbitMQ是没有配置文件的,如需要配置文件,需手动进行配置,文件置于自己Rabbitmq安装路径下的 /etc/rabbitmq/rabbitmq.conf 即可,再管理页面或者日志中都可以查看到路径位置
/usr/local/rabbitmq/sbin/rabbitmq-server -detached
echo "/usr/local/rabbitmq/sbin/rabbitmq-server -detached" >> /etc/rc.local #添加开机自启动。
开启 web 管理界面
/usr/local/rabbitmq/sbin/rabbitmq-plugins enable rabbitmq_management
RabbitMQ默认的账号用户名和密码都是guest。
rabbitmqctl delete_user guest
创建RabbitMQ管理员用户
#创建一个新用户
rabbitmqctl add_user <用户名> <密码>
#将创建的新用户设置为管理员
rabbitmqctl set_user_tags <用户名> administrator
#赋予新创建的用户所有权限
rabbitmqctl set_permissions -p / <用户名> ".*" ".*" ".*"
在本地主机中,使用浏览器访问Linux实例的公网IP:15672。
显示如下页面,说明RabbitMQ安装成功。

3、普通集群模式
在多台机器上启动多个rabbitmq实例,每个机器启动一个。
但是你创建的queue,只会放在一个rabbtimq实例上,但是每个实例都同步queue的元数据(存放含queue数据的真正实例位置)。消费的时候,实际上如果连接到了另外一个实例,那么那个实例会从queue所在实例上拉取数据过来。

三、配置文件详解
所有 受支持的RabbitMQ版本 的主配置文件都使用 类似ini的sysctl配置文件格式。该文件通常命名为Rabbitmq.conf。
| rabbitmq.conf | 新样式格式(sysctl或类似ini的格式) | 主配置文件。应该用于大多数设置。对于人类来说,阅读和机器(部署工具)的生成更容易。并非所有设置都可以这种格式表示。 |
| advanced.config | 经典(Erlang术语) | 不能以新样式配置格式表示的有限数量的设置,例如 LDAP查询。仅在必要时使用。 |
| rabbitmq-env.conf | 环境变量对 | 用于在一处设置与RabbitMQ相关的 环境变量。 |
四、开发实例
1、引入依赖,pom文件:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2、基本配置文件:
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*rabbitMq基本配置*/
@Configuration
public class RabbitMqConfig {public final static String productExchange = "productExchange ";private String productQueue = "productQueue";public final static String ERROR_EXCHANGE = "le.error.exchange";private String topicExchangeName = "";@Beanpublic FanoutExchange productExchange() {return new FanoutExchange(productExchange);}public TopicExchange topicExchange() {return new TopicExchange(topicExchangeName);}@Beanpublic DirectExchange errorExchang() {return new DirectExchange(ERROR_EXCHANGE, true, false);}@Beanpublic Queue productQueue() {return new Queue(productQueue, true);}@Beanpublic Binding productBinding(Queue productQueue, FanoutExchange productExchange) {return BindingBuilder.bind(productQueue).to(productExchange);}
}
3、生产者:
@Component
public class ProductProducer {Logger logger = LoggerFactory.getLogger(ProductProducer.class);@AutowiredRabbitTemplate rabbitTemplate;@AutowiredGson gson;public void push(ProfitEntity profitEntity) {String json = gson.toJson("");logger.info("###消息发送者: json=" + json); rabbitTemplate.convertAndSend(RabbitmqConfig.Product_EXCHANGE, null, json);}}
4、消费者:
@Component
public class TransProductConsumer {Logger logger = LoggerFactory.getLogger(TransproductConsumer.class);@AutowiredRabbitTemplate rabbitTemplate;@AutowiredErrorProducer errorProducer;@AutowiredProductService productService;@RabbitHandler@RabbitListener(queues = RabbitmqConfig.productQueue )public void comsume(String json) {try {logger.info("##start##消费者:TransProductConsumer ,接收到消息:json=" + json);} catch (Exception e) {logger.error("计算消息队列出错 zf.Product.caculate.queue ", e);errorProducer.push(RabbitmqConfig.ERROR_PROFIT_CACULATE_QUEUE, json);}}
}
5、错误消息处理生产者:
@Component
public class ErrorProducer {Logger logger = LoggerFactory.getLogger(TransDetailProducer.class);@AutowiredRabbitTemplate rabbitTemplate;@AutowiredGson gson;public void push(String queueName, String errorJson) {logger.info("###异常消息发送者: queueName=" + queueName + " errorJson=" + errorJson);rabbitTemplate.convertAndSend(RabbitmqConfig.ERROR_EXCHANGE, queueName, errorJson);}public void push(String queueName, Object obj) {String errorJson = gson.toJson(obj);logger.info("###异常消息发送者: queueName=" + queueName + " errorJson=" + errorJson);rabbitTemplate.convertAndSend(RabbitmqConfig.ERROR_EXCHANGE, queueName, errorJson);}}
相关文章:
RabbitMQ 系列教程
一、RabbitMQ 部署及配置详解(集群部署) 二、RabbitMQ 部署及配置详解 (单机) 三、RabbitMQ 详解及实例(含错误信息处理) 四、RabbitMq死信队列及其处理方案 五、RabbitMQ Java开发教程—官方原版 六、RabbitMQ Java开发教程(二&#x…...
无感刷新token
无感刷新 无感刷新Token技术是一种用于实现持久登录体验的关键技术,它通过在用户登录后自动刷新Token,以延长用户的登录状态,避免频繁要求用户重新登录。 实现 使用access_token(短效token)和refresh_token…...
【Python大数据笔记_day06_Hive】
hive内外表操作 建表语法 create [external] table [if not exists] 表名(字段名 字段类型 , 字段名 字段类型 , ... ) [partitioned by (分区字段名 分区字段类型)] # 分区表固定格式 [clustered by (分桶字段名) into 桶个数 buckets] # 分桶表固定格式 注意: 可以排序[so…...
Netty--文件编程
3. 文件编程 3.1 FileChannel ⚠️ FileChannel 工作模式 FileChannel 只能工作在阻塞模式下 获取 不能直接打开 FileChannel,必须通过 FileInputStream、FileOutputStream 或者 RandomAccessFile 来获取 FileChannel,它们都有 getChannel 方法 通过…...
SVN 服务器建立
1.建立SVN库 svnadmin create cat svndir/conf/passwd 修改SVN用户密码 chenht 123456 2.建立目录权限 [aliases] # joe /CXZ/STDessert/LSnake City/OSnake Oil, Ltd./OUResearch Institute/CNJoe Average [groups] # harry_and_sally harry,sally # harry_sally_…...
iPhone或在2024开放第三方应用商店。
iPhone或开放第三方应用商店,可以说这是一个老生常谈的话题。对于像是iOS这样封闭的系统来说,此前传出苹果可能开放侧载消息的时候,又有谁能信,谁会信? 如果是按照苹果自身的意愿,这种事情自然是不可能发生…...
《C和指针》笔记36:动态内存分配
1. malloc和free C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放。这些函数维护一个可用内存池。当一个程序另外需要一些内存时,它就调用malloc函数,malloc从内存池中提取一块合适的内存,并向该…...
C/S架构学习之基于UDP的本地通信(服务器)
基于UDP的本地通信(服务器):创建流程:一、创建数据报式套接字(socket函数): int sock_fd socket(AF_UNIX,SOCK_DGRAM,0);if(-1 sock_fd){perror("socket error");exit(-1);}二、创建…...
excel如何加密(excel加密的三种方法)
Excel是一款广泛使用的办公软件,有时候我们需要对一些重要的Excel文件进行加密,以保证文件的安全性。下面将介绍3种常用的Excel加密方法。 方法一:通过路径文件-另存为-工具-常规选项-设置打开或修改权限密码(密码只可以使数字、字…...
玩了个锤子游戏小程序搭建流程:探索深度与逻辑的结合
随着移动互联网的普及,小程序已经成为了越来越多用户的选择。在这个背景下,玩了个锤子游戏小程序应运而生,它为用户提供了一个全新的游戏体验。那么,如何搭建这样一个小程序呢?本文将为大家详细介绍玩了个锤子游戏小程…...
召回率计算及影响因素
召回率是指在所有正样本中,被成功预测为正样本的样本数占比。在机器学习领域,召回率是评估模型预测性能的重要指标之一。在本文中,我们将从多个方面深入探讨召回率的概念和应用。 阈值越高,精准率越高,召回率越低&…...
在Qt中怎么由函数定义自动创建函数实现模板
2023年11月12日,周日凌晨...
【算法】算法题-20231112
算法题 一、459. 重复的子字符串二、414. 第三大的数三、520. 检测大写字母四、680. 验证回文串 II五、283. 移动零 一、459. 重复的子字符串 简单 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true…...
目标检测YOLO实战应用案例100讲-基于多目标追踪的交通场景异常检测(续)
目录 3.5特征融合网络改进:小目标检测层 3.5.1小目标检测层 3.6实验结果与讨论...
最新支付宝转卡码生成之转账源代码(隐藏部分卡号)
一、需要准备好自己的卡号、名称、以及对应的姓名 二、然后将自己的信息填入下面的代码中 三、然后将拼接好的代码,利用转码技术生产对应的二维码 四、这样一个跳转银行卡二维码的转账码就做好了 效果演示:如下 支付宝扫码、跳转码、转卡码、隐藏卡号…...
聊天机器人框架Rasa资源整理
Rasa是一个主流的构建对话机器人的开源框架,它的优点是几乎覆盖了对话系统的所有功能,并且每个模块都有很好的可扩展性。参考文献收集了一些Rasa相关的开源项目和优质文章。 一.Rasa介绍 1.Rasa本地安装 直接Rasa本地安装一个不好的地方就是容易把本地…...
魔搭社区LLM模型部署实践, 以ChatGLM3为例(一)
魔搭社区LLM模型部署实践, 以ChatGLM3为 例 本文以ChatGLM3-6B为例, 主要介绍在魔搭社区如何部署LLM, 主要包括如下内容: ● SwingDeploy - 云端部署, 实现零代码一键部署 ● 多端部署 - MAC个人笔记本,…...
25期代码随想录算法训练营第十四天 | 二叉树 | 层序遍历(10道题)、226.翻转二叉树 、101.对称二叉树 2
目录 层序遍历 10226.翻转二叉树101.对称二叉树 2 层序遍历 10 链接 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right clas…...
ubuntu cp210x(USB转串口)驱动安装教程
ubuntu cp210x(USB转串口)驱动安装 前言1. 驱动下载2. 驱动编译和安装3. 可能遇到的问题及解决办法3.1 第一种解决方案:检查当前是否已有CP210x.ko驱动3.2 第二种解决方案:修改驱动文件,编译 前言 CP2108 是一款高度集…...
Spring-SpringAOP的实现
对Spring AOP的理解 OOP表示面向对象编程,是一种编程思想,AOP表示面向切面编程,也是一种编程思想 Spring AOP:Spring为了让程序员更加方便的做到面向切面编程所提供的技术支持 Spring提供的一套机制,让我们更容易的…...
ZLUDA终极实践指南:在非NVIDIA GPU上无缝运行CUDA程序的完整方案
ZLUDA终极实践指南:在非NVIDIA GPU上无缝运行CUDA程序的完整方案 【免费下载链接】ZLUDA CUDA on non-NVIDIA GPUs 项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA ZLUDA是一个革命性的开源项目,它让开发者和研究者能够在非NVIDIA GPU上…...
若依框架前后端分离版——高效数据导入实战指南
1. 为什么需要高效数据导入功能 在企业级应用开发中,数据导入是个高频需求场景。想象一下学校每学期要导入上万名学生信息,或者电商平台要批量上架商品,如果一条条手动录入,不仅效率低下还容易出错。我在实际项目中就遇到过这样的…...
2025届学术党必备的六大降AI率方案推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网AI检测系统,会凭借文本结构、词汇搭配以及逻辑连贯性等多方面特征࿰…...
多模态RAG:让AI看懂图也能读懂话
不只是文字,还能“看图说话” 你有没有想过,AI不仅能读文字,还能看图、听声音,甚至把它们串起来理解?这背后就有“多模态RAG”的功劳。传统RAG(检索增强生成)主要处理文本——你问一个问题&…...
告别安装烦恼:在Anaconda Prompt中一站式部署labelimg的完整指南
1. 为什么选择Anaconda环境安装labelimg 第一次接触计算机视觉项目时,最让人头疼的就是各种依赖包的版本冲突问题。我清楚地记得三年前在一个目标检测项目中,因为PyQt5和Python版本不匹配,整整折腾了两天都没能成功运行labelimg。直到后来发现…...
别再为建筑高度数据发愁了!手把手教你用QGIS加载2024版全国SHP建筑轮廓(含高度字段)
2024版全国建筑轮廓数据实战:QGIS三维可视化全流程解析 城市规划师拿到最新建筑轮廓数据后,最迫切的需求往往不是数据本身,而是如何快速将其转化为可分析的视觉成果。本文将彻底解决从SHP文件加载到三维渲染的完整工作流问题,特别…...
GitHub进阶玩法全解析,零基础可快速上手进阶高手,轻松解决各类常见难题下(补充版)
9. GitHub Pages与Webhooks:扩展你的能力边界9.1 GitHub Pages不只是静态网站是的,大家都知道它能托管静态网站。但高级用法包括:自定义域名和HTTPS:完全免费,在仓库设置里绑定自己的域名就行,GitHub会自动…...
mysql如何配置表空间独立存储_使用innodb_file_per_table
已启用 innodb_file_per_table 时新建表有独立 .ibd 文件,否则数据存于 ibdata1;执行 SELECT innodb_file_per_table 或 SHOW VARIABLES LIKE innodb_file_per_table 查看,需在 [mysqld] 段配置文件中设置并重启才永久生效。开启 innodb_file…...
3招轻松搞定微信防撤回失效难题,让你的消息不再“消失“
3招轻松搞定微信防撤回失效难题,让你的消息不再"消失" 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://…...
Oracle RMAN物理备份Web系统讶
springboot自动配置 自动配置了大量组件,配置信息可以在application.properties文件中修改。 当添加了特定的Starter POM后,springboot会根据类路径上的jar包来自动配置bean(比如:springboot发现类路径上的MyBatis相关类ÿ…...
