当前位置: 首页 > 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…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

鸿蒙Navigation路由导航-基本使用介绍

1. Navigation介绍 Navigation组件是路由导航的根视图容器&#xff0c;一般作为Page页面的根容器使用&#xff0c;其内部默认包含了标题栏、内容区和工具栏&#xff0c;其中内容区默认首页显示导航内容&#xff08;Navigation的子组件&#xff09;或非首页显示&#xff08;Nav…...