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

关于RabbitMQ的小总结

问题:消息在转换机无法被路由

发布确认高级作用在生产者发送到转换机,回退消息作用在消息在转换机无法被路由的情况(消息无法路由的意思是,消息在转换机没有匹配到对应的队列),进行消息回退,打印日志,但增加了生产者的复杂性。
前面在设置死信队列的文章中,我们提到,可以为队列设置死信交换机来存储那些 处理失败的消息,可是这些不可路由消息根本没有机会进入到队列,因此无法使用死信队列来保存消息。

解决方法:设置备份交换机

在 RabbitMQ 中,有一种备份交换机的机制存在,可以很好的应对这个问题。什么是备份交换机呢?备份交换机可以理解为 RabbitMQ 中交换机的“备胎”,当我们为某一个交换机声明一个对应的备份交换机时, 就是为它创建一个备胎,当交换机接收到一条不可路由消息时,将会把这条消息转发到备份交换机中,由 备份交换机来进行转发和处理,通常备份交换机的类型为 Fanout ,这样就能把所有消息都投递到与其绑 定的队列中,然后我们在备份交换机下绑定一个队列,这样所有那些原交换机无法被路由的消息,就会都进入这个队列了。当然,我们还可以建立一个报警队列,用独立的消费者来进行监测和报警。

注:若 转换机 设置 备份转换机,在消息在转换机无法被路由的情况下就不会调用 回退消息 的方法,消息 直接转发到备份转换机

可参考一下代码:

package com.ai.boy.config;import com.ai.boy.common.RabbitMqUtils;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** RabbitMq配置类,声明队列、交换机* 绑定备份转换机(Fanout),并绑定备份队列、警告队列* 备份转换机 绑定在 正常转换机 上*/
@Configuration
public class RabbitMqConfig {/*** 声明交换机 Exchange* 并设置该交换机的备份交换机* */@Bean("confirmExchange")public DirectExchange confirmExchange(){/*** return new DirectExchange(CONFIRM_EXCHANGE_NAME);* 若不设置备份交换机,按照以上即可* */return ExchangeBuilder.directExchange(RabbitMqUtils.CONFIRM_EXCHANGE_NAME).durable(true)/**设置该交换机的备份交换机*/.withArgument("alternate-exchange", RabbitMqUtils.BACKUP_EXCHANGE_NAME).build();}/*** 声明确认队列* */@Bean("confirmQueue")public Queue confirmQueue(){return QueueBuilder.durable(RabbitMqUtils.CONFIRM_QUEUE_NAME).build();}/*** 声明确认队列绑定关系* */@Beanpublic Binding queueBinding(@Qualifier("confirmQueue") Queue queue,@Qualifier("confirmExchange") DirectExchange exchange){return BindingBuilder.bind(queue).to(exchange).with(RabbitMqUtils.CONFIRM_KEY);}/*** 声明备份交换机 Exchange* */@Bean("backupExchange")public FanoutExchange backupExchange(){return new FanoutExchange(RabbitMqUtils.BACKUP_EXCHANGE_NAME);}/*** 声明备份队列* */@Bean("backQueue")public Queue backQueue(){return QueueBuilder.durable(RabbitMqUtils.BACKUP_QUEUE_NAME).build();}/*** 声明警告队列* */@Bean("warningQueue")public Queue warningQueue(){return QueueBuilder.durable(RabbitMqUtils.WARNING_QUEUE_NAME).build();}/*** 声明 备份队列 绑定关系* 备份队列绑定备份备份交换机* */@Beanpublic Binding backupBinding(@Qualifier("backQueue") Queue queue,@Qualifier("backupExchange") FanoutExchange backupExchange){return BindingBuilder.bind(queue).to(backupExchange);}/*** 声明 报警队列 绑定关系* 报警队列绑定备份备份交换机* */@Beanpublic Binding warningBinding(@Qualifier("warningQueue") Queue queue,@Qualifier("backupExchange") FanoutExchange backupExchange){return BindingBuilder.bind(queue).to(backupExchange);}}
package com.ai.boy.common;public class RabbitMqUtils {public static final String CONFIRM_EXCHANGE_NAME = "confirm.exchange";public static final String CONFIRM_QUEUE_NAME = "confirm.queue";public static final String CONFIRM_KEY = "key1";public static final String BACKUP_EXCHANGE_NAME = "backup.exchange";public static final String BACKUP_QUEUE_NAME = "backup.queue";public static final String WARNING_QUEUE_NAME = "warning.queue";}
发布确认高级、回退消息
package com.ai.boy.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;/*** 发布确认高级、回退消息* 作用在生产者发送消息到转换机过程*/
@Component
@Slf4j
public class RabbitMqCallBack implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnsCallback {@Autowiredprivate RabbitTemplate rabbitTemplate;@PostConstructpublic void init(){rabbitTemplate.setConfirmCallback(this);/*** true:* 交换机无法将消息进行路由时,会将该消息返回给生产者* false:* 如果发现消息无法进行路由,则直接丢弃*/rabbitTemplate.setMandatory(true);rabbitTemplate.setReturnsCallback(this);}/*** 发布确认高级:* 交换机不管是否收到消息的一个回调方法* 参数:* CorrelationData 消息相关数据* ack 交换机是否收到消息*/@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {String id=correlationData!=null?correlationData.getId():"";if(ack){log.info("交换机已经收到 id 为:{}的消息",id);}else{log.info("交换机还未收到 id 为:{}消息,由于原因:{}",id,cause);}}/*** 回退消息:* 作用在消息在 转换机 无法被路由的情况下 执行 的回调方法* (发布确认高级 已确定消息已发送成功,但在转换机的消息没有匹配到对应的队列)* 注:若 转换机 设置 备份转换机,就不会调用该方法,消息直接转发到备份转换机* */@Overridepublic void returnedMessage(ReturnedMessage returnedMessage) {log.error("回退消息:{},被交换机{}退回,退回原因 :{},路由key:{}",new String(returnedMessage.getMessage().getBody()),returnedMessage.getExchange(),returnedMessage.getReplyText(),returnedMessage.getRoutingKey());}}

相关文章:

关于RabbitMQ的小总结

问题:消息在转换机无法被路由 发布确认高级作用在生产者发送到转换机,回退消息作用在消息在转换机无法被路由的情况(消息无法路由的意思是,消息在转换机没有匹配到对应的队列),进行消息回退,打…...

webgoat靶场攻关

A(5) Broken Access Control Insecure Direct Object References 直接对象引用 直接对象引用是指应用程序使用客户端提供的输入来访问数据和对象。 例子 使用 GET 方法的直接对象引用示例可能如下所示 https://some.company.tld/dor?id12345 https…...

BEV-YOLO 论文学习

1. 解决了什么问题? 出于安全和导航的目的,自驾感知系统需要全面而迅速地理解周围的环境。目前主流的研究方向有两个:第一种传感器融合方案整合激光雷达、相机和毫米波雷达,和第二种纯视觉方案。传感器融合方案的感知表现鲁棒&am…...

C++可以使用负数作为下标索引

今天碰到一个题目,写bfs写炸了,发现好像数组越界,但是却没有报错,而是被边界检查拦截了 导致死循环了??? ps:所以写边界问题,首要的就是对边界进行检查,不检查越界之后…...

react+canvas实现横跨整个页面的动态的波浪线(贝塞尔曲线)

本来写这个特效 我打算用css实现的,结果是一波三折,我太难了,最终没能用css实现,转战了canvas来实现。来吧先看效果图 当然这个图的波浪高度、频率、位置、速度都是可调的,请根据自己的需求调整,如果你讲波…...

峰回网关数采PLC

1.网络配置 例如:plc地址是192.168.1.56 1.访问网关 峰回网关默认网关地址 192.168.3.18,或者(10.10.253.354),本案例按照3.18讲解。 1和1相连,0和电脑相连 本地电脑修改ip为192.168.3.3(和3…...

Vue+element el-date-picker 时间日期选择器设置默认值,选择框不显示问题(已解决)

时间选择器默认值的问题 显示的时候如果用下面的方式赋值将不会显示出来: this.deviceFormData.time[0] that.$filterArray.formatDatehh(start);this.deviceFormData.time[1] that.$filterArray.formatDateEnd(end);实际上是有数据的,但是不会显示出…...

数据挖掘题目:根据规则模板和信息表找出R中的所有强关联规则,基于信息增益、利用判定树进行归纳分类,计算信息熵的代码

一、(30分)设最小支持度阈值为0.2500, 最小置信度为0.6500。对于下面的规则模板和信息表找出R中的所有强关联规则: S∈R,P(S,x )∧ Q(S,y )> Gpa&#xf…...

Reshape.XL 1.2 for Excel插件 Crack

特征 插件 Reshape.XL 包括 130 个基本可组合功能。使用它们,您可以快速轻松地进行非常复杂的数据转换和处理。它们的架构和基本定义受到 SQL 和 R 语言的强烈启发。 到目前为止,类似的功能只能通过脚本语言供程序员使用。借助 Reshape.XL 插件&#xf…...

开发知识点-PHP从小白到拍簧片

从小白到拍簧片 位异或运算(^ )引用符号(&)strlen() 函数base64_encode预定义 $_POST 变量session_start($array);操作符php 命令set_time_limit(7200)isset()PHP 命名空间(namespace)new 实例化类extends 继承 一个类使用另一个类方法error_reporti…...

飞书开发学习笔记(二)-云文档简单开发练习

飞书开发学习笔记(二)-云文档简单开发练习 一.云文档飞书开发环境API 首先还是进入开放平台 飞书开放平台:https://open.feishu.cn/app?langzh-CN 云文档相关API都在“云文档”目录中,之下又有"云空间",“文档”,“电子表格”&a…...

设计模式——命令模式(Command Pattern)+ Spring相关源码

文章目录 一、命令模式定义二、例子2.1 菜鸟教程例子2.1.1 定义命令类接口2.1.2 定义命令执行者2.1.3 被处理对象Stock。2.1.4 封装处理Stock的命令 2.2 JDK源码——Runnable2.2.1 命令接口2.2.2 命令处理者2.2.3 命令实现类 2.3 SpringMVC——Controller2.3.1 请求对象 handle…...

[开源]企业级在线办公系统,基于实时音视频完成在线视频会议功能

一、开源项目简介 企业级在线办公系统 本项目使用了SpringBootMybatisSpringMVC框架,技术功能点应用了WebSocket、Redis、Activiti7工作流引擎, 基于TRTC腾讯实时音视频完成在线视频会议功能。 二、开源协议 使用GPL-3.0开源协议 三、界面展示 部分…...

Scala语言用Selenium库写一个爬虫模版

首先,我将使用Scala编写一个使用Selenium库下载yuanfudao内容的下载器程序。 然后我们需要在项目的build.sbt文件中添加selenium的依赖项。以下是添加Selenium依赖项的代码: libraryDependencies "org.openqa.selenium" % "selenium-ja…...

ZZ038 物联网应用与服务赛题第I套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 (I卷) 赛位号:______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等; 2.竞赛任务中所使用的各类软件工…...

ClickHouse 学习之基础入门(一)

第 1 章 ClickHouse 入 门 ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库(DBMS),使用 C 语言编写,主要用于在线分析处理查询(OLAP),能够使用 SQL 查询实时生成分析数据报告。 …...

HttpClient基本使用

十二、HttpClient 12.1 介绍 HttpClient是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。 HttpClient作用: 发送HTTP请求接收响应数据 …...

力扣:150. 逆波兰表达式求值(Python3)

题目: 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算符为 、-、* 和 / 。每个操作数(运算对象)都可以是一个整数或者另一…...

Tomcat运行日志乱码问题/项目用tomcat启动时窗口日志乱码

文章目录 一、问题描述:二、产生原因三、解决方法 一、问题描述: 项目在idea中运行时日志是正常的,用Tomcat启动时发现一大堆看不懂的文字,如 二、产生原因 产生乱码的根本原因就是编码和解码不一致,举个例子就是翻…...

Leetcode—199.二叉树的右视图【中等】

2023每日刷题(十九) Leetcode—199.二叉树的右视图 深度优先遍历实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(…...

运放电源端串联磁珠

在运放电源端串联磁珠,是一种常见的高频噪声抑制设计手段,但需结合具体应用场景谨慎使用。以下是关键要点:---作用与目的 - 抑制高频噪声:磁珠对高频信号(通常 >10 MHz)呈现高阻抗,将电源线上…...

Chrome密码恢复终极指南:如何安全找回所有浏览器保存的密码

Chrome密码恢复终极指南:如何安全找回所有浏览器保存的密码 【免费下载链接】chromepass Get all passwords stored by Chrome on WINDOWS. 项目地址: https://gitcode.com/gh_mirrors/chr/chromepass 你是否曾经因为忘记某个重要网站的密码而焦虑&#xff1…...

上海AI实验室发布WildClawBench:AI智能体究竟能走多远?

这项由上海人工智能实验室联合香港中文大学、复旦大学、中国科学技术大学、上海交通大学、清华大学、浙江大学及南洋理工大学等多所顶尖机构共同完成的研究,于2026年5月11日以预印本形式发布,论文编号为arXiv:2605.10912v1。感兴趣的读者可通过该编号在a…...

泛微发布300+可落地AI应用 让组织业务数智升级

5月20日,泛微300AI应用场景体验大会在上海举办。大会以“组织的AI范式数字员工与业务流程AI新生”为主题, 展示泛微全场景AI应用。泛微搭载五大智能引擎,提供300可快速落地的AI应用场景,覆盖市场、销售、项目、合同、采购、财务、…...

RK3568国产工业级车载方案:从核心板设计到量产落地的全流程解析

1. 项目概述:为什么选择RK3568作为国产车载方案的基石?在车载电子这个领域,尤其是面向工业级和商用车载应用,选型一款合适的核心处理器平台,往往决定了整个项目的成败周期、成本控制以及最终产品的市场竞争力。过去很长…...

开源数据库 TimescaleDB 2.27.1 发布:性能改进与多项错误修复,官方建议尽快升级

开源数据库 TimescaleDB 2.27.1 版本正式发布,较 2.27.0 版本有性能改进和错误修复,官方建议用户尽快升级。 TimescaleDB 简介 TimescaleDB 是基于 PostgreSQL 构建的开源数据库,打包为 PostgreSQL 扩展程序,可让 SQL 扩展到时间序…...

Debian 12.9 最小化安装后,我这样配置成了一台全能家庭服务器(含桌面、DNS、Cockpit)

Debian 12.9 家庭服务器全栈配置指南:从零构建智能家居中枢 在数字化生活日益普及的今天,家庭服务器正逐渐成为现代智能家居的核心枢纽。一台经过精心配置的Debian服务器不仅能满足文件存储、媒体共享等基础需求,更能通过DNS解析、Web化管理等…...

YOLOv5实战:从Leaky ReLU到Sigmoid,手把手教你配置激活函数(附代码避坑)

YOLOv5激活函数工程实践:从源码修改到性能调优全指南 在目标检测领域,YOLOv5以其出色的平衡速度和精度成为工业界宠儿。但很多开发者在使用预训练模型时,往往忽略了激活函数配置这一关键环节——就像给跑车加错燃油标号,表面能跑…...

ag-psd:重构JavaScript生态中的PSD文件处理范式

ag-psd:重构JavaScript生态中的PSD文件处理范式 【免费下载链接】ag-psd Javascript library for reading and writing PSD files 项目地址: https://gitcode.com/gh_mirrors/ag/ag-psd 在前端工程化与设计系统协同演进的技术浪潮中,PSD文件处理一…...

向量数据库是什么?Milvus 与 ChromaDB 在 AI 测试中的作用

导语:2025年,AI应用开发圈最火的两个关键词——RAG(检索增强生成)和向量数据库。你可能已经用LangChain搭过聊天机器人,用LlamaIndex建过知识库,但你有没有认真想过:那个默默躺在你架构图最底层的向量数据库,到底该选谁?Milvus还是ChromaDB?它们到底有什么区别?对你…...