关于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…...
Reshape.XL 1.2 for Excel插件 Crack
特征 插件 Reshape.XL 包括 130 个基本可组合功能。使用它们,您可以快速轻松地进行非常复杂的数据转换和处理。它们的架构和基本定义受到 SQL 和 R 语言的强烈启发。 到目前为止,类似的功能只能通过脚本语言供程序员使用。借助 Reshape.XL 插件…...
开发知识点-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(…...
Polars 2.0快速接入全链路拆解(含Benchmark实测:比Pandas快42.6×,比Dask低68%内存)
第一章:Polars 2.0快速接入全链路概览Polars 2.0 是一个高性能、内存友好的 DataFrame 库,专为现代多核 CPU 和列式分析场景设计。它通过 Rust 编写核心引擎,Python 接口(polars-py)提供零拷贝数据交互能力,…...
被裁员后,我用这个 AI 助手每天只工作 2 小时|OpenClaw 实战
😭 被裁员后,我用这个 AI 助手每天只工作 2 小时“真正的自由,不是想做什么就做什么,而是不想做什么就可以不做什么”01 一个普通打工人的至暗时刻 上个月,公司裁员 30%。 我所在的部门,5 个人走了 3 个。 …...
爬虫对抗:ZLibrary 反爬机制实战分析(第二版)
摘要: 本文从爬虫工程化角度,详细分析 ZLibrary 站点的常见反爬策略,包括 IP 限流、Cookie 校验、请求头检测、人机验证、接口签名等,并给出对应的 Python 实战对抗思路与代码示例。本文仅用于网络安全技术学习与反爬防护研究&…...
高效构建分布式AI智能体系统:AutoGen架构深度解析与实战指南
高效构建分布式AI智能体系统:AutoGen架构深度解析与实战指南 【免费下载链接】autogen 启用下一代大型语言模型应用 项目地址: https://gitcode.com/GitHub_Trending/au/autogen AutoGen是一个革命性的多智能体对话框架,专为简化基于大型语言模型…...
LSM303DLHC六轴IMU硬件设计与磁场校准实战指南
1. LSM303DLHC 器件概述与工程定位LSM303DLHC 是意法半导体(STMicroelectronics)推出的一款高集成度、低功耗的六轴惯性测量单元(6-DoF IMU),由独立封装的三轴加速度计(LIS3DH 兼容架构)和三轴磁…...
安装claude code,开始学习强大的AI编程助手
1.首先检查是否安装node.js(版本尽量大于22) window端输入winr -> cmd 打开终端查看node版本 可以使用nvm去管理nodejs版本,安装方式见 https://blog.csdn.net/m0_56820004/article/details/159585001?spm1011.2415.3001.10575…...
告别指标混乱:衡石科技指标管理平台的AI自治之路
指标混乱的根源在数字化时代,企业决策依赖的指标体系正面临前所未有的混乱:63%的企业存在指标定义不统一问题,58%的团队因数据口径差异导致决策冲突。这种"指标地狱"不仅消耗大量人力进行数据对齐,更直接导致战略执行偏移。某制造企业的案例极具代表性:其生产部门与财…...
告别文件传输烦恼:用aliyunpan快传链接实现秒级大文件分享
告别文件传输烦恼:用aliyunpan快传链接实现秒级大文件分享 【免费下载链接】aliyunpan 阿里云盘命令行客户端,支持JavaScript插件,支持同步备份功能。 项目地址: https://gitcode.com/GitHub_Trending/ali/aliyunpan 你是否也曾经历过…...
数字电路设计小技巧:从HDLBits例题看SOP与POS的Verilog实现
数字电路设计实战:从真值表到Verilog的SOP与POS高效实现 在数字电路设计中,掌握逻辑表达式的最简化方法是一项基础但至关重要的技能。今天我们就以HDLBits平台上的经典例题ECE241 2013 Q2为例,手把手教你如何从真值表出发,通过卡…...
手把手教你微调MONAI Bundle预训练模型:用TotalSegmentator数据提升CT器官分割精度
深度定制化医学影像分割:基于MONAI Bundle的TotalSegmentator数据微调实战 医学影像分析领域正经历着从通用模型到专用模型的范式转变。当我在去年参与一个肝脏肿瘤分割项目时,深刻体会到预训练模型在特定数据集上表现不佳的困境——不同医院的CT扫描协议…...
