RabbitMQ 死信队列DLX
死信队列的简单介绍
利用dlx,当消息在一个队列中变成死信之后,它能被重新publish到另一个exchange,这个exchange就是dlx
消息变成死信的以下几种情况
消息被拒绝,并且requeue= false
消息ttl过期
队列达到最大的长度
dlx也是一个正常的exchange,和一般的exchange没什么区别,它能在任何的队列上被指定,实际上就是设置某个队列的属性。
当这个队列中有死信时,rabbitmq就会自动的将这个消息重新发布到设置的exchange上,进而被路由到另一个队列。
可以监听这个队列中消息做相应的处理,这个特性可以弥补rabbitMq3.0以前支持的immediate参数的功能。
消费端:
package com.flying.rabbitmq.api.dlx;import java.util.HashMap; import java.util.Map;import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.QueueingConsumer; import com.rabbitmq.client.QueueingConsumer.Delivery;public class Consumer {public static void main(String[] args) throws Exception {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("192.168.11.76");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();// 这就是一个普通的交换机 和 队列 以及路由String exchangeName = "test_dlx_exchange";String routingKey = "dlx.#";String queueName = "test_dlx_queue";channel.exchangeDeclare(exchangeName, "topic", true, false, null);Map<String, Object> agruments = new HashMap<String, Object>();agruments.put("x-dead-letter-exchange", "dlx.exchange");//这个agruments属性,要设置到声明队列上channel.queueDeclare(queueName, true, false, false, agruments);channel.queueBind(queueName, exchangeName, routingKey);//要进行死信队列的声明:channel.exchangeDeclare("dlx.exchange", "topic", true, false, null);channel.queueDeclare("dlx.queue", true, false, false, null);channel.queueBind("dlx.queue", "dlx.exchange", "#");channel.basicConsume(queueName, true, new MyConsumer(channel));} }
自定义消费端:
package com.flying.rabbitmq.api.dlx;import java.io.IOException;import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.DefaultConsumer; import com.rabbitmq.client.Envelope;public class MyConsumer extends DefaultConsumer {public MyConsumer(Channel channel) {super(channel);}@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.err.println("-----------consume message----------");System.err.println("consumerTag: " + consumerTag);System.err.println("envelope: " + envelope);System.err.println("properties: " + properties);System.err.println("body: " + new String(body));}}
生产端:
package com.flying.rabbitmq.api.dlx;import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory;public class Producer {public static void main(String[] args) throws Exception {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("192.168.11.76");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();String exchange = "test_dlx_exchange";String routingKey = "dlx.save";String msg = "Hello RabbitMQ DLX Message";for(int i =0; i<1; i ++){AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder().deliveryMode(2).contentEncoding("UTF-8").expiration("10000").build();channel.basicPublish(exchange, routingKey, true, properties, msg.getBytes());}} }
转载于:https://www.cnblogs.com/lflying/p/11107435.html
RabbitMQ 死信队列DLX相关推荐
- RabbitMQ - 死信队列(DLX)
RabbitMQ - 死信队列(DLX) 配置死信队列 方式1 - RabbitMQ 管理后台配置死信队列 方式2 - 代码创建死信队列 验证 满足死信队列的条件 死信队列只是一个概念,本质就是普通的 ...
- RabbitMQ高级特性(五):RabbitMQ之死信队列DLX
一.死信队列简介 (1)死信队列 死信队列,英文缩写:DLX .Dead Letter Exchange(死信交换机),当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就 ...
- 消息中间件--RabbitMQ --死信队列
https://blog.csdn.net/u012211603/article/details/85707760 介绍一些概念 1.首先是任何的MQ中,都有死信队列的存在 2.RabbitMQ的死信 ...
- Springboot——死信队列 DLX 配置和使用
文章目录 前言 什么是死信 配置和测试死信 思路分析 配置类编写 编写消息发送服务 测试 消息什么时候会成为死信消息? 总结 参考资料 代码下载 前言 上一篇博客 Springboot--整合Rabb ...
- Rabbitmq死信队列
目录 1.什么是死信队列 2.产生死信队列的原因 3.代码实现---直连交换机 3.1.导入依赖 3.2.配置rabbitmq连接信息 3.3.编写配置类 3.4.编写生产者 3.5.编写消费者 3. ...
- rabbitmq死信队列详解与使用
关注架构师高级俱乐部 开启架构之路 不定期福利发放哦~ 什么是死信队列 先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer将消息投递到b ...
- RabbitMQ死信队列应用
目录 1.什么是死信队列 2.死信队列应用场景 3.延迟消息概念 3.1 消息的TTL(Time To Live) 3.2 死信交换器 3.3 延时队列 4.死信队列使用流程图 5.死信队列应用(管理 ...
- 【分布式】Rabbitmq死信队列模型、实战场景---订单延迟30min支付处理
分布式 内容管理 死信队列 死信队列demo 死信队列消息模型 平台订单支付超时 --- 演示 业务分析 代码实现 RabbitMQ 死信队列/ 延迟队列 - 延迟业务逻辑 最近可能分布式进入Redi ...
- Java秒杀系统实战系列~RabbitMQ死信队列处理超时未支付的订单(转)
转自: https://juejin.cn/post/6844903903130042376 文末有源代码,非常棒 摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十篇,本篇 ...
最新文章
- 剑指offer:二叉树镜像
- Shell教程(六):函数、联机帮助
- Direct2D (11) : 画刷之 ID2D1LinearGradientBrush
- 疫情伤了谁?反正不是这8大直播行业
- nginx+php+mysql+erlang+mongo环境安装
- [Codeforces700E Cool Slogans]
- java开发和structs的关系_java---springMVC与strutsMVC的区别
- 第五章 使用 Bootstrap Typeahead 组件(百度下拉效果)
- [Axios] axios的请求合并以及参数配置
- Ethos北京公司(来自北欧的IT咨询公司)求贤若渴:.NET架构师
- vue_axios请求封装、异常拦截统一处理
- Google GPS在Android上的一些应用
- pands 画图 调整大小_两个精品案例解释机械设计的步骤,有思路,再着手画图...
- 在线加密视频一机一码播放器
- 打字游戏之主界面实现
- 使用ZED相机识别颜色醒目的水壶并计算与相机的距离
- Linux SPI驱动学习——调用SPI读写函数
- using Aspose文档合并总结
- 马云的“平头哥”芯片公司,会比董明珠的格力芯片厉害吗?
- 2017 后端面试经历分享
热门文章
- 2.6 基于ARDUINO UNO+MC20的路径显示功能
- 360webscan.php 使用,【漏洞练习-Day15】360webscan 使用$_SERVER['PHP_SELF']不当
- 亲测好用的开发工具【1】 RuoYi-MT
- Android之软键盘自动弹出和关闭
- 【日志检索系统ELK搭建】
- JQuery 遍历数组 或者JSON
- 端口状态 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT详解,以及三次握手,滑动窗口
- easyui datagrid 页码设置
- 支付宝小程序选择手机本地视频
- Linux文件MD5校验