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

如何将普通队列异常消息路由到死信队列

如何将普通队列异常消息路由到死信队列

在RabbitMQ中,我们经常需要处理异常消息,特别是当消息处理失败时。一个常见的用例是将异常消息路由到死信队列,以便稍后重新处理或进一步分析。在本篇博客中,我们将演示如何配置RabbitMQ和Spring Boot,以便将普通队列中的异常消息自动路由到死信队列。

步骤1:创建Spring Boot项目

首先,创建一个Spring Boot项目并添加以下依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.0</version></dependency>
</dependencies>

步骤2:配置RabbitMQ和队列

在`application.yml文件中,配置RabbitMQ连接信息:

spring:#给项目来个名字application:name: rabbitmq-provider#配置rabbitMq 服务器rabbitmq:host: 127.0.0.1port: 5672username: rootpassword: 123456#虚拟host 可以不设置,使用server默认hostvirtual-host: /cdn#确认消息已发送到交换机(Exchange)#确认消息已发送到队列(Queue)publisher-returns: truelistener:simple:acknowledge-mode: autoretry:#enabled:开启失败重试enabled: true#第一次重试的间隔时长initial-interval: 1000ms#最长重试间隔,超过这个间隔将不再重试max-interval: 300000ms#下次重试间隔的倍数,此处是2即下次重试间隔是上次的2倍multiplier: 2max-attempts: 4default-requeue-rejected: false  # 达到重试次数进入死信队列publisher-confirm-type: none

然后,创建一个Spring组件,它将包括配置RabbitMQ队列和消息监听器:

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.hutool.core.util.RandomUtil;@RestController
public class ExceptionToDead {@AutowiredRabbitTemplate rabbitTemplate;@Beanpublic Queue normalQueue() {return QueueBuilder.durable("my-normal-queue").withArgument("x-dead-letter-exchange", "my-dead-letter-exchange").withArgument("x-dead-letter-routing-key", "my-dead-letter-routing-key").build();}@Beanpublic DirectExchange normalExchange() {return new DirectExchange("my-normal-exchange");}@Beanpublic Binding normalBinding(Queue normalQueue, DirectExchange normalExchange) {return BindingBuilder.bind(normalQueue).to(normalExchange).with("my-normal-routing-key");}@Beanpublic DirectExchange deadLetterExchange() {return new DirectExchange("my-dead-letter-exchange");}@Beanpublic Queue deadLetterQueue() {return QueueBuilder.durable("my-dead-letter-queue").build();}@Beanpublic Binding deadLetterBinding(Queue deadLetterQueue, DirectExchange deadLetterExchange) {return BindingBuilder.bind(deadLetterQueue).to(deadLetterExchange).with("my-dead-letter-routing-key");}@RabbitListener(queues = "my-normal-queue")public void receiveFromNormalQueue(Integer message) {System.out.println("正常队列收到消息: " + message);if (message % 2 == 0) {int a = 1 / 0; // 引发异常}}@RabbitListener(queues = "my-dead-letter-queue")public void receiveFromDeadLetterQueue(Integer message) {System.out.println("死信队列收到消息: " + message);}@GetMapping("send")public void send() {int number = RandomUtil.randomInt(0, 100);rabbitTemplate.convertAndSend("my-normal-exchange", "my-normal-routing-key", number);}@GetMapping("b")public void b() {int number = RandomUtil.randomInt(0, 100);rabbitTemplate.convertAndSend("simple-key", number);}
}

在这段代码中,我们创建了一个名为my-normal-queue的队列,它将异常消息路由到my-dead-letter-exchange交换机,然后再路由到my-dead-letter-queue队列。我们还创建了相应的交换机和绑定。

注意: 自动确认的时候 ,达到重试次数之后就会路由到绑定的死信,否则消息会丢失

​ 手动确认的时候,消费时候在需要的位置channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,false); 消息才会路由到死信,否则消息会积压

步骤3:监听异常消息并触发死信路由

在上述代码中,我们使用@RabbitListener注解来监听my-normal-queue队列。当消息处理失败时(在这里,我们模拟了一个条件,如果消息为偶数,则引发异常),它将被路由到死信队列。

步骤4:触发异常消息

最后,我们在/send端点上创建了一个HTTP请求,它将发送一个随机整数到my-normal-queue队列。如果随机整数

相关文章:

如何将普通队列异常消息路由到死信队列

如何将普通队列异常消息路由到死信队列 在RabbitMQ中&#xff0c;我们经常需要处理异常消息&#xff0c;特别是当消息处理失败时。一个常见的用例是将异常消息路由到死信队列&#xff0c;以便稍后重新处理或进一步分析。在本篇博客中&#xff0c;我们将演示如何配置RabbitMQ和…...

MATLAB中perceptron函数用法

目录 语法 说明 示例 使用感知器求解简单分类问题 perceptron函数的功能是简单的单层二类分类器。 语法 perceptron(hardlimitTF,perceptronLF) 说明 注意 Deep Learning Toolbox™ 支持早期形式的感知器。为了获得更好的结果&#xff0c;您应改用 patternnet&#xff0…...

使用Python进行数据科学

数据科学是一门涉及收集、清洗、处理和分析数据的学科&#xff0c;而Python是一种强大的编程语言&#xff0c;广泛应用于数据科学领域。本文将介绍如何使用Python进行数据处理和分析的基本技术和工具。 一、数据收集 在进行数据分析之前&#xff0c;首先需要收集数据。Python…...

Go语言在硬件开发领域的应用

引言 Go语言是一种快速、简洁且高效的编程语言&#xff0c;由Google开发并于2009年发布。虽然Go语言在Web开发和后端服务方面广受欢迎&#xff0c;但其在硬件开发领域的应用也日益增多。本文将探讨Go语言在硬件开发中的优势和应用案例&#xff0c;并分析其对硬件开发的影响。 …...

小程序如何设置首选配送公司

小程序的一个重要环节就是配送服务。为了提供更好的发货体验&#xff0c;避免商家总是要在众多的配送公司中选择想要&#xff0c;小程序支持设置首选配送。下面将具体介绍一下小程序如何设置。 在小程序管理员后台->配送设置->首选配送处&#xff0c;指定需要设置的首选…...

聚观早报 |2024款飞凡R7官宣;小米14新配色材质

【聚观365】10月27日消息 2024款飞凡R7官宣 小米14新配色材质 金山办公2023第三季度业绩 IBM2023第三季度业绩 新东方2024财年第一季度业绩 2024款飞凡R7官宣 飞凡汽车官宣&#xff0c;2024款飞凡R7将于11月上市&#xff0c;新车将搭载飞凡巴赫座舱&#xff0c;同时超过1…...

【kubernetes】Debian使用Kubeadm部署Kubernetes失败:Connection Refused

这篇文章也可以在我的博客中查看 今天废话不多说直接解决一个阴间问题 问题 在部署kubernetes后&#xff08;执行完kubeadm init后&#xff09;&#xff0c;执行任何kubectl命令&#xff0c;都会报以下错误&#xff1a; The connection to the server xxx.xxx.xxx.xxx:6443…...

Wpf 使用 Prism 实战开发Day02

一.设计首页导航条 导航条的样式&#xff0c;主要是从Material DesignThemes UI 拷贝过来修改的,项目用了这个UI组件库&#xff0c;就看自己需要什么&#xff0c;就去拷过来使用&#xff0c;界面布局或其他组件使用&#xff0c;不做介绍。 直接下载源码&#xff0c;编译运行就可…...

基于本体的军事术语知识图谱构建方法

源自&#xff1a; 智汇杰瑞 “人工智能技术与咨询” 发布 摘 要 1 军事术语知识图谱构建流程 ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ 图1 军事术语知识图谱构建流程 2 军事术语本体构建 2.1 军事术语数据结构分析 2.2 军事术语本体设计 ※ ※ ※ ※ ※ ※ ※…...

Web APIs——事件委托

1、事件委托 事件委托&#xff08;Event delegation&#xff09;是一种JavaScript设计模式&#xff0c;用于处理事件监听和处理程序的优化。它通过将事件处理程序绑定到父元素而不是绑定到子元素&#xff0c;从而减少DOM元素上的事件处理程序数量。 事件委托是利用事件流的特征…...

【SpringMVC篇】讲解RESTful相关知识

&#x1f38a;专栏【SpringMVC】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f384;REST简介&#x1f33a;RESTful入门案例⭐案例一⭐…...

HTML基本概念:

HTML简介&#xff1a; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 1&#xff09;、HTML 是用来描述网页的一种语言。 2&#xff09;、HTML 不是一种编程语言&am…...

webpack编译卡住65不动,问题记录

此问题webpack没有报任何错误&#xff0c;导致我们只能用排除法&#xff0c;排除了整整一下午&#xff0c;为了避免又浪费一个下午时间&#xff0c;特此记录这个重要的问题。重启电脑也试了&#xff0c;清理缓存也试了&#xff0c;然后node_modules也重新安装了很多遍&#xff…...

当在本地,向服务器发送信息时,服务器接受信息返回给客户端,此时采用多行读取时,客户端接收不到Server的信息

public class SocketTCP04Server {public static void main(String[] args) throws IOException {ServerSocket serverSocket new ServerSocket(9999);System.out.println("Server&#xff1a;"serverSocket.getClass());System.out.println("正在等待用户连接.…...

2310D,Dll,栈跟踪

原文 帮助 有没有想过,如果运行时拥有调试器功能,会怎样? 对系统语言来说,常见问题是解引用空针.这几乎总是会导致崩溃,很难找到该问题,特别是你不是该项目的原始开发者时. 但是,不要害怕,在此我要讲如何在不需要实际附加调试器时获得有用的调试信息. 在Java中,已存在一个叫…...

JVS-BI数字大屏设计器:一站式解决方案

数字大屏介绍 数字大屏是当下数据展示、业务监控、指挥调度常见的业务表达形态&#xff0c;常有可视化的图表、效果装饰、事件操作等技术组成酷炫的效果展示。 配置入口 进入JVS-BI&#xff08;bi.bctools.cn&#xff09;&#xff0c;进入大屏页面&#xff0c;如下图所示 ①…...

uniapp 中添加 vconsole

uniapp 中添加 vconsole 一、安装 vconsole npm i vconsole二、使用 vconsole 在项目的 main.js 文件中添加如下内容 // #ifdef H5 // 提交前需要注释 本地调试使用 import * as vconsole from "vconsole"; new vconsole() // 使用 vconsole // #endif三、成功...

目标检测 YOLOv5 预训练模型下载方法

目标检测 YOLOv5 预训练模型下载方法 flyfish https://github.com/ultralytics/yolov5 https://github.com/ultralytics/yolov5/releases 可以选择自己需要的版本和不同任务类型的模型 后缀名是pt...

第16章_变量、流程控制与游标

第16章_变量、流程控制与游标 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 1. 变量 在MySQL数据库的存储过程和函数中&#xff0c;可以使用变量来存储查询或计算的中间结果数据&#xff0c;或…...

谁知道腾讯云轻量服务器“月流量”是什么意思?

腾讯云轻量服务器月流量什么意思&#xff1f;月流量是指轻量服务器限制每月流量的意思&#xff0c;不能肆无忌惮地使用公网&#xff0c;流量超额需要另外支付流量费&#xff0c;上海/广州/北京等地域的轻量服务器月流量不够用超额部分按照0.8元/GB的价格支付流量费。阿腾云aten…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...