rabbitmq死信交换机,死信队列使用

背景

对于核心业务需要保证消息必须正常消费,就必须考虑消费失败的场景,rabbitmq提供了以下三种消费失败处理机制

  1. 直接reject,丢弃消息(默认)
  2. 返回nack,消息重新入队列
  3. 将失败消息投递到指定的交换机
    对于核心业务,第一种方法显然不可接受,第二种方法如果代码有异常导致消费一直失败就会出现不断失败重新入队列的死循环问题,较好的方案是3,待消费失败问题修复后将消息从死信队列取出发回原队列重新消费。

实现

  • rabbit版本
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-amqp</artifactId>
  <version>2.6.3</version>
</dependency>
  • 配置死信交换机,路由,队列
    在这里插入图片描述
    在这里插入图片描述
  • 配置延迟消息业务队列消费失败投递到死信队列
@Bean("orderCloseQueue")
    public Queue orderCloseQueue() {
        return QueueBuilder.durable(OrderRabbitConstants.ORDER_CLOSE_QUEUE)
            .deadLetterExchange(RabbitMqConstants.DEAD_LETTER_EXCHANGE)
            .deadLetterRoutingKey(RabbitMqConstants.DEAD_LETTER_ROUTING_KEY)
            .build();
    }
  • 配置手动返回ACK
@Bean(name = {"manualContainerFactory"})
public SimpleRabbitListenerContainerFactory manualContainerFactory(@Qualifier("connectionFactory") ConnectionFactory connectionFactory) {
	SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
	this.manualFactoryConfigurer.configure(factory, connectionFactory);
	factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
	factory.setDefaultRequeueRejected(this.enableRequeueRejected);
	if (this.enableConsumers) {
		factory.setConcurrentConsumers(this.concurrentConsumers);
		factory.setMaxConcurrentConsumers(this.maxConcurrentConsumers);
		factory.setPrefetchCount(this.prefetchCount);
	}
	return factory;
}
  • 业务队列消息消费模拟失败
@RabbitListener(queues = OrderRabbitConstants.ORDER_CLOSE_QUEUE, containerFactory = "manualContainerFactory")
    public void consumerCloseOrder(Message message, Channel channel) throws IOException {
        String orderCode = new String(message.getBody(), CharsetUtil.UTF_8);
        String messageId = message.getMessageProperties().getMessageId();
        log.info("收到MQ messageId[{}],订单号[{}]", messageId, orderCode);
        if (true) {
            channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
            return;
        }
    }
  • 效果
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    可以看到死信队列dead.letter.queue已经正常收到死信消息
  • 编写逻辑将死信消费推回原队列
for (int i = 0; i < 10_000; i++) {
     Message message = rabbitTemplate.receive(RabbitMqConstants.DEAD_LETTER_QUEUE);
     if (message == null) {
         return String.format("完成%d条", i);
     }
     log.info("拉取死信消息:[{}]", message);
     try {
         Map<String, Object> headers = message.getMessageProperties().getHeaders();
         Map<String, Object> deathMap = ((List<Map<String, Object>>) headers.get("x-death")).get(0);
         String exchange = deathMap.get("exchange").toString();
         String routingKey = ((List) deathMap.get("routing-keys")).get(0).toString();
         rabbitTemplate.send(exchange, routingKey, message);
     } catch (Exception ex) {
         log.error("消费死信消息失败", ex);
         rabbitTemplate.send(RabbitMqConstants.DEAD_LETTER_EXCHANGE, RabbitMqConstants.DEAD_LETTER_ROUTING_KEY, message);
         return "重入队列异常";
     }
 }
  • 重推回业务队列效果
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/511271.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu-server部署hive-part4-部署hive

参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本&#xff1a;ubuntu-server-22.04.3 虚拟机&#xff1a;virtualbox7.0 部署hive 下载上传 下载地址 http://archive.apache.org/dist/hive/ apache-hive-3.1.3-bin.tar.gz 以root用户上传至…

财务数字化转型如何找到打通业财融合的关键点

敏捷应对外部复杂情况保持竞争力、加强内部协同联动实现降本增效、赋能流程再造推动企业在变化中进化……多重战略价值下&#xff0c;企业数字化变革已经从“可选项”变成了“必选项”。 财务数字化转型正在成为推动“高韧性”企业高增长的核心驱动力。现在&#xff0c;以财务助…

JavaScript基础代码练习之数列第n位

一、这段代码要求用户输入一个数字n&#xff0c;然后使用递归的方式计算斐波那契数列中第n位的值&#xff0c;并将结果以警告框的形式显示出来。斐波那契数列是一个经典的数学问题&#xff0c;其中每个数字是前两个数字的和&#xff0c;数列的前两个数字通常是1。因此&#xff…

【MATLAB源码-第28期】基于matlab的16QAM定时同步仿真,采用gardner算法,Costa锁相环。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交幅度调制&#xff08;QAM&#xff0c;Quadrature Amplitude Modulation&#xff09;是一种在两个正交载波上进行幅度调制的调制方式。这两个载波通常是相位差为90度&#xff08;π/2&#xff09;的正弦波&#xff0c;因此…

DevOps与CI/CD简介

DevOps 是一种软件开发和运维的文化、实践和方法论&#xff0c;旨在通过加强开发团队和运维团队之间的合作和沟通&#xff0c;实现快速、高效、可靠的软件交付和运维。DevOps 是由 Development&#xff08;开发&#xff09;和 Operations&#xff08;运维&#xff09;两个单词组…

基于深度学习的常见车型识别系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;在本博客中介绍了基于YOLOv8/v7/v6/v5的常见车型识别系统。核心技术采用YOLOv8&#xff0c;并融合了YOLOv7、YOLOv6、YOLOv5的算法优势&#xff0c;进行了细致的性能指标对比。详细介绍了国内外在常见车型识别方面的研究现状、数据集处理方法、算法原理、模型构…

Linux(centos) 安装GraalVM

文章目录 版权声明GraalVM 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用&#xff0c;并非商业用途。我在整理学习笔记的过程中尽力确保准确性&…

力扣-python-丑数

解答&#xff1a; class Solution:def isUgly(self, n: int) -> bool:if n < 0:return False# 将 n 依次除以 2、3、5&#xff0c;直到 n 不能再被这些因子整除while n % 2 0:n // 2while n % 3 0:n // 3while n % 5 0:n // 5return n 1class Solution:def isUgly(s…

手写简易操作系统(二十一)--硬盘驱动

前情提要 上面一节我们实现了 malloc 和 free 的系统调用&#xff0c;这一节我们来实现硬盘驱动。 一、硬盘分区 我们的文件系统安装在一块全新的硬盘中&#xff0c;我们先创建它&#xff0c;然后在给他分区。 1.1、创建硬盘 首先是创建&#xff0c;这个之前我们已经干过一…

《Git版本控制管理》笔记

第三章 git --version查看版本号git --help查看帮助文档裸双破折号分离参数 git diff -w master origin – tools/Makefile将当前目录或任何目录转化为Git版本库 git init 初始化之后项目目录中&#xff0c;有名为.git的文件git status 查看git状态git commit 提供日志消息和作…

Docker、Kubernetes之间的区别

比较容器化工具&#xff1a;了解 Docker、Kubernetes 在应用程序部署和管理方面的差异。 基本概述 Docker 是一个流行的容器化平台&#xff0c;允许开发人员在容器中创建、部署和运行应用程序。 Docker 提供了一组工具和 API&#xff0c;使开发人员能够构建和管理容器化应用程…

【星海随笔】Ubuntu22.04忘记密码

服务器篇&#xff1a; 有问题可留言。 第一步 远程console界面进入该设备 并重启该设备 如果看到这个界面情况 则点击右上角按钮 【发送 CtrlAltDelete】 调出grub启动菜单 NOTE&#xff1a;启动的后半段去点击这个按钮&#xff0c;前半段一直点会一直重启 如果是直连服务器&a…

AI智能客服机器人是什么?对企业重要吗?

在数字化时代&#xff0c;客户服务是企业与客户建立牢不可破关系的重要桥梁。AI智能客服机器人&#xff0c;顾名思义&#xff0c;就是利用人工智能技术提升客户服务体验的自动化工具。今天&#xff0c;就让我们来揭开AI智能客服机器人的神秘面纱&#xff0c;并讨论它对企业的重…

增强Java技能:使用OkHttp下载www.dianping.com信息

在这篇技术文章中&#xff0c;我们将探讨如何使用Java和OkHttp库来下载并解析www.dianping.com上的商家信息。我们的目标是获取商家名称、价格、评分和评论&#xff0c;并将这些数据存储到CSV文件中。此外&#xff0c;我们将使用爬虫代理来绕过任何潜在的IP限制&#xff0c;并实…

Ollama教程——入门:开启本地大型语言模型开发之旅

Ollama教程——入门&#xff1a;开启本地大型语言模型开发之旅 引言安装ollamamacOSWindows预览版LinuxDocker ollama的库和工具ollama-pythonollama-js 快速开始运行模型访问模型库 自定义模型从GGUF导入模型自定义提示 CLI参考创建模型拉取模型删除模型复制模型多行输入多模态…

越南工厂连接中国总部服务器解决方案---案例分享

随着全球化的不断深入&#xff0c;许多中国企业走出国门&#xff0c;在世界各地设立分支机构和生产基地。然而&#xff0c;随之而来的是跨国网络通信的挑战。近期&#xff0c;客户越南的工厂与中国总部之间的网络连接出现了一些问题&#xff0c;这直接影响了企业的日常运营效率…

Go-Gin中优雅的实现参数校验,自定义错误消息提示

问题描述 在参数校验的时候我们一般会基于"github.com/go-playground/validator/v10"这个库给结构体加标签实现校验参数&#xff0c;当参数校验错误的时候&#xff0c;他的提示一般是英文的&#xff0c;怎么自定义参数错误提示呢&#xff1f;跟着我一步步来 注册校…

备战蓝桥杯---贪心刷题1

话不多说&#xff0c;直接看题&#xff1a; 本质是一个数学题&#xff1a; 我们令xi<0表示反方向传递&#xff0c;易得我们就是求每一个xi的绝对值之和min,我们令平均值为a爸。 易得约束条件&#xff1a; x1-x2a1-a,x2-x3a2-a..... 解得x1x1-0,x2x1-((n-1)*a-a2-...an)。…

硬件了解 笔记

motherboard的高低端区别在哪里&#xff1f; 核心&#xff1a;从单核变成双核&#xff0c;多核&#xff08;几核就是几个打工人&#xff09; 多线程&#xff1a;6核本来对应6个线程&#xff0c;但是多线程就是说6核对应12个线程 频率 主频&#xff1a;平时打工的速度 睿频&…

达梦数据库 优化

谁进行优化&#xff1f;优化什么&#xff1f; 优化不能仅从数据库方面考虑&#xff0c;比如&#xff0c;在存储达到数据库极限、应用涉及人员设计的代码稀巴烂的情况下&#xff0c;进行调优就是杯水车薪的效果。 涉及到优化人员&#xff1a; 数据库管理员应用程序架构师应用…