rabbitMQ的死信队列的处理模型示例

在这里插入图片描述

示例场景:
消费者发送消息给normal_exchange交换机,队列normal-queue通过routingKeyz:zhangsan绑定normal_exchange,消费者C1消费。
使队列normal_queue达到死信条件时候,normal-queue队列把消息发送给dead-exchange交换机,routingKey为lisi。这个死信队列由C2消费者处理。

rabbitMQ出现死信场景:
1.消息被拒(消费者ack应答)
2.消息TTL过期(声明队列时候或者生产者发送消失时设置TTL)
3.队列达到最大长度(声明队列时候设置)

消费者C1 声明两个交换机,两个队列以及两个队列与交换机的绑定关系,也设定好正常队列与死信交换机的关系 当前代码时消费者被拒时的死信队列
package com.esint.rabbitmq.work06;import com.esint.rabbitmq.RabbitMQUtils;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;import java.util.HashMap;/*** 私信队列 处理*/
public class Consumer01 {public static final String NORMAL_EXCHANGE = "normal_exchange";public static final String DEAD_EXCHANGE   = "dead_exchange";public static final String NORMAL_QUEUE    = "normal_queue";public static final String DEAD_QUEUE      = "dead_queue";public static void main(String[] args) throws Exception {Channel channel = RabbitMQUtils.getChannel();/*** 声明交换机*/channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);/*** 声明队列*  队列转发私信交换机配置**  【设置过期时间】*  x-message-ttl  10000毫秒 队列设置过期时间 也可以在发送的时候设置* 正常队列 转发给死信交换机 设置过期后的死信交换机* 【过期成为死信交换机指定名称】  x-dead-letter-exchange* 【过期成为私信指定routig-key】  x-dead-letter-routing-key**/HashMap<String, Object> arguments = new HashMap<>();
//        arguments.put("x-message-ttl",10000); //队列设置过期时间 单位毫秒 这里可以设定,发消息也可以设定。通常在发消息时候设定
//        arguments.put("x-max-length",6);//设置最大队列长度arguments.put("x-dead-letter-exchange",DEAD_EXCHANGE);arguments.put("x-dead-letter-routing-key","lisi");//注意 :通常我们消费者发送消息至交换机时指定routing-key 这里的消息在特定情况下发送到交换机,channel.queueDeclare(NORMAL_QUEUE,false,false,false,arguments);/***/channel.queueDeclare(DEAD_QUEUE,false,false,false,null);//队列绑定交换机 *普通channel.queueBind(NORMAL_QUEUE,NORMAL_EXCHANGE,"zhangsan");//队列绑定交换机 *死信channel.queueBind(DEAD_QUEUE,DEAD_EXCHANGE,"lisi");DeliverCallback deliverCallback = (deliverTag,mes)->{String getmsg = new String(mes.getBody(),"UTF-8");if(getmsg.equals("message7")){channel.basicReject(mes.getEnvelope().getDeliveryTag(),false);//第二个参数时:拒绝后是否回滚队列System.out.println("此消息时被拒绝的C1:"+ getmsg);}else{channel.basicAck(mes.getEnvelope().getDeliveryTag(),false);System.out.println("消费者1接收的消息" + new String(mes.getBody(),"UTF-8"));}};boolean autoAck = false;channel.basicConsume(NORMAL_QUEUE,autoAck,deliverCallback,tag->{});}
}
生产者:单纯的发送消息给正常交换机. 消息过期时间
package com.esint.rabbitmq.work06;import com.esint.rabbitmq.RabbitMQUtils;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;/*** 私信队列处理的生产者*/
public class Produc {public static final String NORMAL_EXCHANGE = "normal_exchange";public static void main(String[] args) throws Exception {Channel channel = RabbitMQUtils.getChannel();//交换机 队列已经在消费01声明了 所以这里不要在声明 注意这里的测试需要先启动消费者01AMQP.BasicProperties poperties = new AMQP.BasicProperties().builder().expiration("10000").build();//设置消息过期TTLfor (int i = 0; i < 10; i++) {String mes = "message" + i;channel.basicPublish(NORMAL_EXCHANGE,"zhangsan",poperties,mes.getBytes("UTF-8"));}}
}
消费者C2消费 死信队列
package com.esint.rabbitmq.work06;import com.esint.rabbitmq.RabbitMQUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;public class Consumer02 {public static final String DEAD_QUEUE      = "dead_queue";public static void main(String[] args) throws Exception {Channel channel = RabbitMQUtils.getChannel();System.out.println("C2等待接受消息...");DeliverCallback deliverCallback =  (deleverTag,mes)->{System.out.println(new String(mes.getBody(),"UTF-8"));};channel.basicConsume(DEAD_QUEUE,true,deliverCallback,tags->{});}
}

实用场景:
用户在商城购买商品提交订单后,假设30分钟内为正常队列,超期未支付为死信队列 TTL

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echarts 实现同一组legend控制两个饼图示例

实现同一组legend控制两个饼图示例&#xff1a; 该示例有如下几个特点&#xff1a; ①饼图不同值实现分割 ②实现tooltip自定义样式&#xff08;echarts 实现tooltip提示框样式自定义-CSDN博客&#xff09; ③自定义label内容 ④不同值颜色渐变 代码如下&#xff1a; this.o…

Python基础:输入输出详解-输出字符串格式化

Python中的输入和输出是编程中非常重要的方面。 1. 输入输出简单介绍 1.1 输入方式 Python中的输入可以通过input()函数从键盘键入&#xff0c;也可以通过命令行参数或读取文件的方式获得数据来源。 1&#xff09;input()示例 基本的input()函数&#xff0c;会将用户在终端&…

爬取全国高校数据 (高校名称,高校所在地,高校类型,高校性质,高校特色,高校隶属,学校网站)

爬取全国高校数据 网站&#xff1a; 运行下面代码得到网站. import base64 # 解码 website base64.b64decode(IGh0dHA6Ly9jb2xsZWdlLmdhb2thby5jb20vc2NobGlzdC8.encode(utf-8)) print(website)分析&#xff1a; 我们需要爬取的字段&#xff0c;高校名称&#xff0c;高校所…

计算两个图形遮盖率

读取图像 首先&#xff0c;加载待处理的图像&#xff0c;可以使用图像处理库&#xff08;例如OpenCV&#xff09;来实现这一步。确保已加载正确的图像。 定义特定颜色范围 确定所需的特定颜色范围。这将是要检测的马赛克填充的颜色。需要指定颜色的下限值和上限值&#xff0c;通…

系列一、GC概述 作用域

一、概述 GC是垃圾回收的意思。次数上频繁收集Young区&#xff0c;少收集Old区&#xff0c;基本不动元空间。 二、作用域 GC的作用域是方法区和堆&#xff0c;主要针对于堆。

性能测试之性能监控详解

性能监控 性能监控是指通过收集、分析和报告关键性能指标&#xff0c;实时监测系统、应用程序或网络的性能和健康状况。通过性能监控&#xff0c;您可以及时发现潜在的性能问题&#xff0c;识别系统瓶颈&#xff0c;并进行性能优化。【点击文末小卡片免费领取测试资料】 以下…

内网信息收集-网络安全

目录 本机信息收集 查看系统配置信息 查看系统服务信息 查看系统登录信息 自动信息收集 域内信息收集 判断是否存在域 探测域内存主机&端口 powershell arp扫描 小工具 telnet 查看用户&机器&会话相关信息 查看机器相关信息 查看用户相关信息 本机信…

三江城115m²3室2厅2卫,现代简约不单是居所更是对生活的向往。福州中宅装饰,福州装修

【前言】 简洁有力&#xff0c;静默无声。 以简约精致的方式&#xff0c;展现现代都市生活&#xff1b; 经典不因潮流褪色&#xff0c;不为悦人只为悦己。 项目信息 项目名称 | 三江城 设计地址 | 福建福州 项目面积 | 115㎡ 项目户型 | 3室2厅 设计风格 | 现代简约 全…

对分过层后的类进行可视化

变量是&#xff1a; std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clusters_k_upper std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clusters_k_lower std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clusters_un…

FindMy技术用于保温杯

在即将到来的冬季&#xff0c;每个人都开始给自己准备一个保温杯&#xff0c;保温杯是一种盛水的容器&#xff0c;主要由陶瓷或不锈钢制成&#xff0c;并加入真空层&#xff0c;以实现保温效果。这种杯子顶部有盖&#xff0c;密封严实&#xff0c;能够延缓内部液体散热&#xf…

影像仪全景导航,快速定位产品特征!

**在工业制造领域中&#xff0c;影像仪全景导航可以提供全景影像&#xff0c;将整个区域的图像精准地捕捉下来&#xff0c;并通过软件算法实现高效处理&#xff0c;以呈现出更加清晰和详细的视图。**这一技术不仅可以提高定位精度&#xff0c;同时还能大幅度提升定位效率。与自…

武汉凯迪正大—变频互感器特性测试仪

互感器综合测试仪主要特点 仅需进行简单的数字设定&#xff1a;设定互感器的额定参数。仪器将全过程自动记录数据&#xff0c;并自动将变比极性、伏安特性曲线等计算并显示出来&#xff0c;省去换线、手动调压、人工记录、整理、描曲线等烦琐劳动。 现场检定电流互感器无需标…