RabbitMq-进阶-07-DLX
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相关推荐
- 《RabbitMQ 实战指南》第四章 RabbitMQ进阶(上)
<RabbitMQ 实战指南>第四章 RabbitMQ进阶(上) 文章目录 <RabbitMQ 实战指南>第四章 RabbitMQ进阶(上) 一.简介 二.消息何去何从 1.m ...
- 《RabbitMQ 实战指南》第五章 RabbitMQ 进阶(下)
<RabbitMQ 实战指南>第五章 RabbitMQ 进阶(下) 文章目录 <RabbitMQ 实战指南>第五章 RabbitMQ 进阶(下) 一.持久化 二.生产者确认 1 ...
- python进阶07 MySQL
python进阶07 MySQL 一.MySQL基本结构 1.认识MySQL #MySQL不是数据库,它是数据库管理软件 #MySQL如何组织数据 #如何进入MySQL数据库 #其他注意事项#以表格的 ...
- django进阶07用户模块与权限系统
原创:django进阶07用户模块与权限系统 Django默认提供了用户权限管理模块auth, 1 2 3 user表,User是auth模块中维护用户信息的表,在数据库中该表被命名为auth_use ...
- python进阶07并发之三其他问题
原创博客地址:python进阶07并发之三其他问题 何时使用多进程(线程) 使用多进程or线程,对于python,考虑到GIL锁,基本上默认使用多进程就对了. 除此之外,线程共享全局变量,进程全局变量 ...
- 【外行也能看懂的RabbitMQ系列(四)】—— RabbitMQ进阶篇之通过插件实现延迟队列(内含实现代码及rabbitmq_delayed_message_exchange安装)
系列文章目录 准备篇 RabbitMQ安装文档 第一章 RabbitMQ快速入门篇 第二章 RabbitMQ的Web管理界面详解 第三章 RabbitMQ进阶篇之死信队列 第四章 RabbitMQ进阶 ...
- RabbitMQ 死信队列DLX
死信队列的简单介绍 利用dlx,当消息在一个队列中变成死信之后,它能被重新publish到另一个exchange,这个exchange就是dlx 消息变成死信的以下几种情况 消息被拒绝,并且reque ...
- RabbitMQ - 死信队列(DLX)
RabbitMQ - 死信队列(DLX) 配置死信队列 方式1 - RabbitMQ 管理后台配置死信队列 方式2 - 代码创建死信队列 验证 满足死信队列的条件 死信队列只是一个概念,本质就是普通的 ...
- rabbitmq进阶一
上一篇文章有讲到rabbitmq的安装.web管理端和springboot简单集成rabbitmq 本文重点介绍rabbitmq相关api的使用 按照官网常用的五种模式的顺序:HelloWorld.W ...
- Python进阶07 函数对象
秉承着一切皆对象的理念,我们再次回头来看函数(function).函数也是一个对象,具有属性(可以使用dir()查询).作为对象,它还可以赋值给其它对象名,或者作为参数传递. lambda函数 在展开 ...
最新文章
- Console类浅谈
- java简易计算器考察什么_练习:用java写一个简易计算器
- ubuntu 虚拟机安装
- 终于下定决心以后要定期清理清理一下园子啦
- linux安装svn(yum安装)
- 生成Treeview树 递归方法
- 【渝粤教育】广东开放大学 服务标准化 形成性考核 (41)
- SAP ABAP 查询接口参数数据结构的报表
- leetcode 5724. 绝对差值和
- 微信的Linux版本,ubuntu16.04安装微信,linux原生版
- PS 基本了解和图层
- CIO如何计算信息化的投资回报率?
- Ps流转H264流 代码实现
- kruskalCase克鲁斯卡尔算法
- jy-10-SPRINGMYBATIS01——MyBatis-程祖红/刘苍松
- “人各有志,给分六十”
- 安卓手机作为文件共享服务器,如何设置电脑使安卓手机能访问局域网共享的文件...
- 阿里云域名 动态ip绑定 python方案
- 1 仓储管理系统 仓库端快速上手
- 正则表达式如何匹配电子邮箱?
热门文章
- 制作篇1 - 宿主机准备制作环境
- 国产化操作系统银河麒麟操作系统V10安装部署Go详讲解
- 现在的工作就好像这碗牛肉面,腻了!
- 我的世界java版建绿宝石农场_我的世界:你会用新版手动绿宝石农场吗?灾厄巡逻队搭配地狱门!...
- 汶川地震,信息技术与死神赛跑
- php超链接字体大小,中国大学MOOC: 设置了超链接的文字颜色会发生变
- Jetson TX2板载摄像头(二)
- matlab中的一些数学运算
- ChainNet: Learning on Blockchain Graphs with Topological Features
- DevOps 漫谈:从作坊到工厂的寓言故事