RabbitMq高级特性之死信队列 又称 死信交换机 DLX

介绍

当消息成为 Dead message 后,会重新发送到另一个交换机,这个交换机就是 DLX(死信交换机)

消息成为死信的情况公有三种:

  1. 队列消息长度达到限制
  2. 消费者拒接消费消息 basicNack/basicReject,并且不把消息重新放回原目标队列,requeue=false;
  3. 原队列消息存在消息过期设置,消息达到过期时间

前提

完成 RabbitMq高级特性之TTL过期设置

代码展示

一、更改RabbitMqConfig.java文件

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 配置类
*/
@Configuration
public class RabbitMqConfig {
private static final String TOPIC_EXCHANGE_NAME = "topic_exchange";
private static final String TOPIC_QUEUE_NAME = "topic_queue"; public static final String DLX_EXCHANGE = "dlx_exchange";
public static final String DLX_QUEUE = "dlx_queue";
public static final String DLX_ROUTING_KEY = "dlx"; /**
* 创建 交换机
* @return
*/
@Bean
public Exchange itemTopicExchange(){
return ExchangeBuilder.topicExchange(TOPIC_EXCHANGE_NAME).build();
} @Bean
public Exchange DlxExchange(){
return ExchangeBuilder.directExchange(DLX_EXCHANGE).build();
} /**
* 创建 队列
* @return
*/
@Bean
public Queue itemQueue(){
//QueueBuilder.durable(TOPIC_QUEUE_NAME).withArgument("x-message-ttl",3000).build();
//与下句代码 效果一致 写一个就可以
//与死信交换机绑定
return QueueBuilder.durable(TOPIC_QUEUE_NAME).ttl(3000).deadLetterExchange(DLX_EXCHANGE).deadLetterRoutingKey(DLX_ROUTING_KEY).build();
} @Bean
public Queue dlxQueue(){
return QueueBuilder.durable(DLX_QUEUE).build();
} /**
* 绑定 交换机与队列
* @param exchange
* @param queue
* @return
*/
@Bean
public Binding itemQueueExchange(@Qualifier("itemTopicExchange") Exchange exchange, @Qualifier("itemQueue") Queue queue){
return BindingBuilder.bind(queue).to(exchange).with("item.#").noargs();
} @Bean
public Binding itemQueueExchange(@Qualifier("dlxExchange") Exchange exchange, @Qualifier("dlxQueue") Queue queue){
return BindingBuilder.bind(queue).to(exchange).with(DLX_ROUTING_KEY).noargs();
} }

二、测试

  1. 如有topic_queue已存在,请删除
  2. 执行ProducerTest.java单元测试
  3. 过期的死信队列会跑到DLX_QUEUE队列中

三、小结

  1. 死信队列也可以创建一个消费者来消息死信消息
  2. 可以在RabbitMqConfig.java文件中的itemQueue()方法中设置队列的最大限度,QueueBuilder.maxLendth(5); 当出入大于5个消息,多余的会丢到死信队列中
  3. channel.basicNack(deliveryTag, true, false);确认消息但是不发送回原目标队列,会丢到死信队列中

RabbitMq高级特性之死信队列 通俗易懂 超详细 【内含案例】的更多相关文章

  1. RabbitMQ(二):RabbitMQ高级特性

    RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.作为一名合格的开发者,有必要了解一下相关知识,RabbitMQ(一)已经入门RabbitMQ,本文介绍Rabb ...

  2. 《RabbitMQ》什么是死信队列

    一 什么是死信队列 当一条消息在队列中出现以下三种情况的时候,该消息就会变成一条死信. 消息被拒绝(basic.reject / basic.nack),并且requeue = false 消息TTL ...

  3. RabbitMQ高级特性

    消息的可靠投递 在使用Rabbitmq的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景.Rabbitmq为我们提供了两种方式用来控制消息的投递可靠性模式 confirm确认模式 return ...

  4. RabbitMQ延迟消息:死信队列 | 延迟插件 | 二合一用法+踩坑手记+最佳使用心得

    前言 前段时间写过一篇: # RabbitMQ:消息丢失 | 消息重复 | 消息积压的原因+解决方案+网上学不到的使用心得 很多人加了我好友,说很喜欢这篇文章,也问了我一些问题. 因为最近工作比较忙, ...

  5. RabbitMQ之消息模式简单易懂,超详细分享~~~

    前言 上一篇对RabbitMQ的流程和相关的理论进行初步的概述,如果小伙伴之前对消息队列不是很了解,那么在看理论时会有些困惑,这里以消息模式为切入点,结合理论细节和代码实践的方式一起来学习. 正文 常 ...

  6. RabbitMQ实战(三)-高级特性

    0 相关源码 1 你将学到 如何保证消息百分百投递成功 幂等性 如何避免海量订单生成时消息的重复消费 Confirm确认消息.Return返回消息 自定义消费者 消息的ACK与重回队列 限流 TTL ...

  7. RabbitMQ使用 prefetch_count优化队列的消费,使用死信队列和延迟队列实现消息的定时重试,golang版本

    RabbitMQ 的优化 channel prefetch Count 死信队列 什么是死信队列 使用场景 代码实现 延迟队列 什么是延迟队列 使用场景 实现延迟队列的方式 Queue TTL Mes ...

  8. 消息队列——RabbitMQ的基本使用及高级特性

    文章目录 一.引言 二.基本使用 1. 简单示例 2. work queue和公平消费消息 3. 交换机 三.高级特性 1. 消息过期 2. 死信队列 3. 延迟队列 4. 优先级队列 5. 流量控制 ...

  9. 消息中间件——RabbitMQ(八)高级特性全在这里!(下)

    前言 上一篇消息中间件--RabbitMQ(七)高级特性全在这里!(上)中我们介绍了消息如何保障100%的投递成功?,幂等性概念详解,在海量订单产生的业务高峰期,如何避免消息的重复消费的问题?,Con ...

  10. 面试官:RabbitMQ过期时间设置、死信队列、延时队列怎么设计?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 RabbitMQ我们经常的使用, ...

随机推荐

  1. 常用RAID级别简介

    RAID不同等级的两个目标: 1. 增加数据可靠性 2. 增加存储的读写性能 RAID级别: ​ RAID-0: 是以条带的形式将数据均匀分布在阵列的各个磁盘上 ​ 优点:读写性能高,不存在校验,不会 ...

  2. Android自动化-如何获取视图元素属性?

    在做Android自动化时候,我们需要知道视图有哪些元素,元素都有哪些属性,获取到属性我们才能获取到元素从而做自动化控制,所以做Android自动化获取元素属性是必要的第一步 获取视图元素属性最便捷的 ...

  3. scarpy基础

    1. 创建项目 scrapy startproject 项目名称 2. 进入项目 cd 项目名称 3. 创建爬虫 scrapy genspider 名字 域名 4. 可能需要start_urls,修改 ...

  4. NXP i.MX 8M Mini工业级核心板规格书(四核ARM Cortex-A53 + 单核ARM Cortex-M4,主频1.6GHz)

     1 核心板简介 创龙科技SOM-TLIMX8是一款基于NXP i.MX 8M Mini的四核ARM Cortex-A53 + 单核ARM Cortex-M4异构多核处理器设计的高端工业级核心板,AR ...

  5. 基于Java+SpringBoot+vue+element助农平台设计和实现

    \n文末获取源码联系 感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询 系统介绍: 随着互联网大趋势的到来,社会的方方面面,各行各业都在考虑利用互联网作为媒介将自 ...

  6. ABC361-D题解

    背景 保佑LC能来一中. 题意 给你一个长度为 \(n\) 的初始字符串和目标字符串,都由 W 和 B 两种字符构成. 现在初始字符串末尾接有两个空格字符,每次你可以在该字符串中选出连续两个非空格字符 ...

  7. Hack The Box

    Hack The Box 地址 https://www.hackthebox.com/ HACKTHEBOX 是一个网络安全实战平台,提供了各种 靶机 和 实验室,同时也是一个庞大的 黑客社区 怎么注 ...

  8. 手把手帮助你搭建属于自己的个人博客,使用cervel部署,无需后端

    1.项目简介 项目使用了vue+elementUI技术栈,通过读取本地md文件实现博客文章的展示,使用vercel实现自动化部署,纯前端项目,无需后端 第一步:下载源码 仓库地址: github:ht ...

  9. vue中封装api数据层访问层

    api封装的是通过封装get/post/jsonp等请求,使得页面无需直接访问后代而是调用相关方法直接获取相关的后代数据,避免过多的数据处理逻辑,将重点放在数据渲染上. 1,准备阶段 a,首先创建ap ...

  10. scanf、cin及其优化、快读性能测试

    为了让大家了解C++各种IO方式的性能,于是就有了这篇文章. 本次测试采取的数据均为 \(10^6\) 个不超过 \(10^8\) 随机正整数. 测试代码: #include<bits/stdc ...