1、1 简介
死信队列,英文缩写:DLX  。Dead Letter Exchange(死信交换机),当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。1、2 消息成为死信的三种情况:队列消息长度到达限制;消费者拒接消费消息,并且不重回队列;原队列存在消息过期设置,消息到达超时时间未被消费;
2、1 代码实现// DLX// 先定义正常的队列和交换机public static final String TEST_DLX_EXCHANGE_NAME = "test_dlx_exchange";public static final String TEST_DLX_QUEUE_NAME = "test_dlx_queue";// 定义死信队列public static final String DLX_EXCHANGE_NAME = "dlx_exchange";public static final String DLX_QUEUE_NAME = "dlx_queue";/*** @author Echo* 死信队列的交换机*/@Bean("SpringBootDLXExchange")public Exchange DLXExchange(){return ExchangeBuilder.topicExchange(DLX_EXCHANGE_NAME).durable(true).build();}/*** @author Echo* 死信队列的队列*/@Bean("SpringBootDLXQueue")public Queue DLXQueue() {return QueueBuilder.durable(DLX_QUEUE_NAME).build();}/*** @author Echo* 绑定死信队列和交换机*/@Beanpublic Binding bindDLXQueueTOExchange(@Qualifier("SpringBootDLXQueue") Queue queue, @Qualifier("SpringBootDLXExchange") Exchange exchange){return BindingBuilder.bind(queue).to(exchange).with("dlx.#").noargs();}/*** @author Echo* 正常的交换机*/@Bean("SpringBootDLXTestExchange")public Exchange DLXTestExchange(){return ExchangeBuilder.topicExchange(TEST_DLX_EXCHANGE_NAME).durable(true).build();}/*** @author Echo* 正常的队列*/@Bean("SpringBootDLXTestQueue")public Queue DLXTestQueue() {Map<String,Object> map = new HashMap<>();// 设置队列的过期时间map.put("x-message-ttl",10000);// 设置队列的长度限制map.put("x-max-length",10);// x-dead-letter-exchange:死信交换机名称map.put("x-dead-letter-exchange",DLX_EXCHANGE_NAME);// x-dead-letter-routing-key:发送给死信交换机的routingkeymap.put("x-dead-letter-routing-key","dlx.hello");return QueueBuilder.durable(TEST_DLX_QUEUE_NAME).withArguments(map).build();}/*** @author Echo* 绑定队列和交换机*/@Beanpublic Binding bindDLXTestQueueTOExchange(@Qualifier("SpringBootDLXTestQueue") Queue queue, @Qualifier("SpringBootDLXTestExchange") Exchange exchange){return BindingBuilder.bind(queue).to(exchange).with("test.dlx.#").noargs();}2、2 消费者代码:
/*** @className DLXListener* @author Echo* @description 死信队列-监听类* @updateTime 2022/1/2 13:06* @version 1.0*/
@Component
public class DLXListener {@RabbitListener(queues = "test_dlx_queue")public void TopicQueueListener(Message msg,Channel channel) throws Exception {long deliveryTag = msg.getMessageProperties().getDeliveryTag();try {Thread.sleep(2000);// 1、接受转换的消息System.out.println(new String(msg.getBody()));// 2、业务逻辑处理// 手动异常int i = 3 / 0;System.out.println("业务逻辑处理中-------------");// 3、手动签收/*** @author Echo* basicAck(long deliveryTag, boolean multiple)* 参数解释:*      deliveryTag:为每条信息带有的tag值*      multiple:为true时会将小于等于此次tag的所有消息都确认掉,为false则只确认当前tag的信息*/channel.basicAck(deliveryTag,true);} catch (Exception e) {// 4、接受失败策略/*** @author Echo* basicNack(long deliveryTag, boolean multiple, boolean requeue)* 参数解释:*      deliveryTag:同上*      multiple:同上*      requeue:如果设置为true,则消息重新回到queue,broker会重新发送该消息给消费端,false 则会直接将此消息丢弃*/channel.basicNack(deliveryTag,true,false);}}
}2、3 测试:
/*** @className DLXProducerTest* @author Echo* @description 死信队列测试* @updateTime 2022/1/2 12:47* @version 1.0*/@SpringBootTest
@RunWith(SpringRunner.class)
public class DLXProducerTest {// 1、注入RabbitTemplate@Autowiredprivate RabbitTemplate rabbitTemplate;/*** 发送测试死信消息:*  消息成为死信的三种情况:*      队列消息长度到达限制;*      消费者拒接消费消息,并且不重回队列;*      原队列存在消息过期设置,消息到达超时时间未被消费;*/@Testpublic void testDlx(){// 1. 测试过期时间,死信消息// rabbitTemplate.convertAndSend("test_dlx_exchange","test.dlx.hello","我是一条消息,我会死吗?");// 2. 测试长度限制后,消息死信
//        for (int i = 0; i < 20; i++) {//            rabbitTemplate.convertAndSend("test_dlx_exchange","test.dlx.hello","我是一条消息,我会死吗?");
//        }// 3. 测试消息拒收rabbitTemplate.convertAndSend("test_dlx_exchange","test.dlx.haha","我是一条消息,我会死吗?");}
}

效果如下:

1、测试过期时间

2、测试长度限制后,消息死信

3、测试消息拒收

项目代码链接:https://github.com/Mbm7280/rabbitmq_demo

RabbitMq-进阶-07-DLX相关推荐

  1. 《RabbitMQ 实战指南》第四章 RabbitMQ进阶(上)

    <RabbitMQ 实战指南>第四章 RabbitMQ进阶(上) 文章目录 <RabbitMQ 实战指南>第四章 RabbitMQ进阶(上) 一.简介 二.消息何去何从 1.m ...

  2. 《RabbitMQ 实战指南》第五章 RabbitMQ 进阶(下)

    <RabbitMQ 实战指南>第五章 RabbitMQ 进阶(下) 文章目录 <RabbitMQ 实战指南>第五章 RabbitMQ 进阶(下) 一.持久化 二.生产者确认 1 ...

  3. python进阶07 MySQL

    python进阶07 MySQL 一.MySQL基本结构 1.认识MySQL #MySQL不是数据库,它是数据库管理软件 #MySQL如何组织数据 #如何进入MySQL数据库 #其他注意事项#以表格的 ...

  4. django进阶07用户模块与权限系统

    原创:django进阶07用户模块与权限系统 Django默认提供了用户权限管理模块auth, 1 2 3 user表,User是auth模块中维护用户信息的表,在数据库中该表被命名为auth_use ...

  5. python进阶07并发之三其他问题

    原创博客地址:python进阶07并发之三其他问题 何时使用多进程(线程) 使用多进程or线程,对于python,考虑到GIL锁,基本上默认使用多进程就对了. 除此之外,线程共享全局变量,进程全局变量 ...

  6. 【外行也能看懂的RabbitMQ系列(四)】—— RabbitMQ进阶篇之通过插件实现延迟队列(内含实现代码及rabbitmq_delayed_message_exchange安装)

    系列文章目录 准备篇 RabbitMQ安装文档 第一章 RabbitMQ快速入门篇 第二章 RabbitMQ的Web管理界面详解 第三章 RabbitMQ进阶篇之死信队列 第四章 RabbitMQ进阶 ...

  7. RabbitMQ 死信队列DLX

    死信队列的简单介绍 利用dlx,当消息在一个队列中变成死信之后,它能被重新publish到另一个exchange,这个exchange就是dlx 消息变成死信的以下几种情况 消息被拒绝,并且reque ...

  8. RabbitMQ - 死信队列(DLX)

    RabbitMQ - 死信队列(DLX) 配置死信队列 方式1 - RabbitMQ 管理后台配置死信队列 方式2 - 代码创建死信队列 验证 满足死信队列的条件 死信队列只是一个概念,本质就是普通的 ...

  9. rabbitmq进阶一

    上一篇文章有讲到rabbitmq的安装.web管理端和springboot简单集成rabbitmq 本文重点介绍rabbitmq相关api的使用 按照官网常用的五种模式的顺序:HelloWorld.W ...

  10. Python进阶07 函数对象

    秉承着一切皆对象的理念,我们再次回头来看函数(function).函数也是一个对象,具有属性(可以使用dir()查询).作为对象,它还可以赋值给其它对象名,或者作为参数传递. lambda函数 在展开 ...

最新文章

  1. Console类浅谈
  2. java简易计算器考察什么_练习:用java写一个简易计算器
  3. ubuntu 虚拟机安装
  4. 终于下定决心以后要定期清理清理一下园子啦
  5. linux安装svn(yum安装)
  6. 生成Treeview树 递归方法
  7. 【渝粤教育】广东开放大学 服务标准化 形成性考核 (41)
  8. SAP ABAP 查询接口参数数据结构的报表
  9. leetcode 5724. 绝对差值和
  10. 微信的Linux版本,ubuntu16.04安装微信,linux原生版
  11. PS 基本了解和图层
  12. CIO如何计算信息化的投资回报率?
  13. Ps流转H264流 代码实现
  14. kruskalCase克鲁斯卡尔算法
  15. jy-10-SPRINGMYBATIS01——MyBatis-程祖红/刘苍松
  16. “人各有志,给分六十”
  17. 安卓手机作为文件共享服务器,如何设置电脑使安卓手机能访问局域网共享的文件...
  18. 阿里云域名 动态ip绑定 python方案
  19. 1 仓储管理系统 仓库端快速上手
  20. 正则表达式如何匹配电子邮箱?

热门文章

  1. 制作篇1 - 宿主机准备制作环境
  2. 国产化操作系统银河麒麟操作系统V10安装部署Go详讲解
  3. 现在的工作就好像这碗牛肉面,腻了!
  4. 我的世界java版建绿宝石农场_我的世界:你会用新版手动绿宝石农场吗?灾厄巡逻队搭配地狱门!...
  5. 汶川地震,信息技术与死神赛跑
  6. php超链接字体大小,中国大学MOOC: 设置了超链接的文字颜色会发生变
  7. Jetson TX2板载摄像头(二)
  8. matlab中的一些数学运算
  9. ChainNet: Learning on Blockchain Graphs with Topological Features
  10. DevOps 漫谈:从作坊到工厂的寓言故事