网易首页 > 网易号 > 正文 申请入驻

谈谈SpringBoot+RabbitMQ 死信队列

0
分享至

  前言

  死信:无法被消费的消息,称为死信。

  如果死信一直留在队列中,会导致一直被消费,却从不消费成功。

  所以我们专门开辟了一个来存放死信的队列,叫死信队列(DLX,dead-letter-exchange)。

  死信的几种来源:

  消息 TTL 过期(time to live,存活时间,可以用在限时支付消息)

  队列达到最大长度(队列满了,无法路由到该队列)

  消息被拒绝(basic.reject / basic.nack),并且requeue = false

  环境准备配置

  准备 MQ 的队列和环境:

  正常交换机

  正常队列(最长队列 5) ---- 正常消费者,拒绝消息

  ttl 队列(过期时间 60 秒) ---- 没有消费者

  死信交换机

  死信队列

  主要配置文件如下:

  @Configuration
public class DeadConfig {

  /* 正常配置 **********************************************************************************************************/

  /**
* 正常交换机,开启持久化
*/
@Bean
DirectExchange normalExchange() {
return new DirectExchange("normalExchange", true, false);
}

  @Bean
public Queue normalQueue() {
// durable: 是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
// exclusive: 默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
// autoDelete: 是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
Map args = deadQueueArgs();
// 队列设置最大长度
args.put( "x-max-length", 5);
return new Queue( "normalQueue", true, false, false, args);
}

  @Bean
public Queue ttlQueue() {
Map args = deadQueueArgs();
// 队列设置消息过期时间 60 秒
args.put( "x-message-ttl", 60 * 1000);
return new Queue( "ttlQueue", true, false, false, args);
}

  @Bean
Binding normalRouteBinding() {
return BindingBuilder.bind(normalQueue()).to(normalExchange()).with( "normalRouting");
}

  @Bean
Binding ttlRouteBinding() {
return BindingBuilder.bind(ttlQueue()).to(normalExchange()).with( "ttlRouting");
}

  /* 死信配置 **********************************************************************************************************/

  /**
* 死信交换机
*/
@Bean
DirectExchange deadExchange() {
return new DirectExchange( "deadExchange", true, false);
}

  /**
* 死信队列
*/
@Bean
public Queue deadQueue() {
return new Queue( "deadQueue", true, false, false);
}

  @Bean
Binding deadRouteBinding() {
return BindingBuilder.bind(deadQueue()).to(deadExchange()).with( "deadRouting");
}

  /**
* 转发到 死信队列,配置参数
*/
private Map deadQueueArgs () {
Map map = new HashMap<>();
// 绑定该队列到私信交换机
map.put( "x-dead-letter-exchange", "deadExchange");
map.put( "x-dead-letter-routing-key", "deadRouting");
return map;
}

  }

  arguments 具体参数如下:

  队列达到最大长度

  首先测试最简单的,没有消费者。

  调用6次正常队列的生产方法。

  /**
* 正常消息队列,队列最大长度5
*/
@GetMapping("/normalQueue")
public String normalQueue() {

  Map map = new HashMap<>();
map.put( "messageId", String.valueOf(UUID.randomUUID()));
map.put( "data", System.currentTimeMillis() + ", 正常队列消息,最大长度 5");

  rabbitTemplate.convertAndSend( "normalExchange", "normalRouting", map, new CorrelationData());
return JSONObject.toJSONString(map);
}

  MQ 结果如下:

  消息 TTL 过期

  消息的TTL 指的是消息的存活时间,我们可以通过设置消息的TTL或者队列的TTL来实现。

  消息的TTL :对于设置了过期时间属性(expiration)的消息,消息如果在过期时间内没被消费,会过期

  队列的TTL :对于设置了过期时间属性(x-message-ttl)的队列,所有路由到这个队列的消息,都会设置上这个过期时间

  两种配置都行,一般都用在定时任务,限时支付这种地方。

  /**
* 消息 TTL, time to live
*/
@GetMapping("/ttlToDead")
public String ttlToDead() {

  Map map = new HashMap<>();
map.put( "messageId", String.valueOf(UUID.randomUUID()));
map.put( "data", System.currentTimeMillis() + ", ttl队列消息");

  rabbitTemplate.convertAndSend( "normalExchange", "ttlRouting", map, new CorrelationData());
return JSONObject.toJSONString(map);
}

  发送后:

  等待过期后:

  Demo 中只是为了方便,代码中尽量使用 消息TTL,不要用 队列TTL

  拒绝消息

  正常队列消费后拒绝消息,并且不进行重新入队:

  @Component
@RabbitListener(queues = "normalQueue")
public class NormalConsumer {
@RabbitHandler
public void process(Map message, Channel channel, Message mqMsg) throws IOException {
System.out.println("收到消息,并拒绝重新入队 : " + message.toString());
channel.basicReject(mqMsg.getMessageProperties().getDeliveryTag(), false);
}
}

  MQ 控制台:

  死信队列消费:

  @Component
@RabbitListener(queues = "deadQueue")
public class DeadConsumer {
@RabbitHandler
public void process(Map message, Channel channel, Message mqMsg) throws IOException {
System.out.println("死信队列收到消息 : " + message.toString());
channel.basicAck(mqMsg.getMessageProperties().getDeliveryTag(), false);
}
}

  消息顺序和实验一致:

  死信队列收到消息 : {data=1631534291765, 正常队列消息,最大长度 5, messageId=bce3888b-da38-4299-ac88-d22cbe164739}
死信队列收到消息 : {data=1631535222745, ttl队列消息, messageId=a4617445-5aab-4fac-aec7-5709ea699598}
死信队列收到消息 : {data=1631534503765, 正常队列消息,最大长度 5, messageId=b65ecaab-5ce7-4597-a32c-c90b67ec46da}
死信队列收到消息 : {data=1631534511468, 正常队列消息,最大长度 5, messageId=d63d2a4c-e7d3-4f00-a6ca-78e2d62d1d92}
死信队列收到消息 : {data=1631534585087, 正常队列消息,最大长度 5, messageId=eed0c349-415b-43dc-aa79-c683122a1289}
死信队列收到消息 : {data=1631534588311, 正常队列消息,最大长度 5, messageId=7a7bd152-f2fa-4a74-b9e6-943ac7cbb3d4}
死信队列收到消息 : {data=1631534608504, 正常队列消息,最大长度 5, messageId=9de512a1-4ca4-4060-9096-27aba01c1687}

  免责声明:

  本公众号部分分享的资料来自网络收集和整理,所有文字和图片版权归属于原作者所有,且仅代表作者个人观点,与本公众号无关,文章仅供读者学习交流使用,并请自行核实相关内容,如文章内容涉及侵权,请联系后台管理员删除。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
窦骁做梦都没想到,演一个小配角,就让他彻底摆脱了豪门赘婿标签

窦骁做梦都没想到,演一个小配角,就让他彻底摆脱了豪门赘婿标签

芬霏剧时光
2026-05-25 10:29:50
韩国超模自曝身材烦恼:太丰满也是一种负担,1个穿搭秘诀化解困扰

韩国超模自曝身材烦恼:太丰满也是一种负担,1个穿搭秘诀化解困扰

赴一场山海啊
2026-05-25 00:12:48
陈龙受伤后现身医院,大儿子全程陪同,章龄之埋怨他不遵医嘱!

陈龙受伤后现身医院,大儿子全程陪同,章龄之埋怨他不遵医嘱!

情感大头说说
2026-05-26 01:50:07
9月1日起严查落地,中央部委新规,房子档案要重新建档案了

9月1日起严查落地,中央部委新规,房子档案要重新建档案了

专业聊房君
2026-05-26 10:11:53
广东2名顾客带宠物猫进沃尔玛,一边撸猫一边用手触碰熟食,随后又放回原处,门店回应:店内禁止宠物入内,目前已上报管理层研判处置

广东2名顾客带宠物猫进沃尔玛,一边撸猫一边用手触碰熟食,随后又放回原处,门店回应:店内禁止宠物入内,目前已上报管理层研判处置

北青网-北京青年报
2026-05-26 15:31:17
武契奇被授予友谊勋章 ​​​​,对外最高荣誉,已向7位元首颁发

武契奇被授予友谊勋章 ​​​​,对外最高荣誉,已向7位元首颁发

光电科技君
2026-05-25 23:12:21
反常一幕出现,中国已断供日本稀土4个月,日方却还没出现危机

反常一幕出现,中国已断供日本稀土4个月,日方却还没出现危机

林子说事
2026-05-26 18:19:56
霸王茶姬的加盟商可能是最惨茶饮人

霸王茶姬的加盟商可能是最惨茶饮人

巨潮WAVE
2026-05-26 12:46:32
俄方:外国公民尽快离开基辅

俄方:外国公民尽快离开基辅

第一财经资讯
2026-05-26 11:11:48
中方通告全球,对菲律宾发布66号公告:马科斯知道,中国动真格了

中方通告全球,对菲律宾发布66号公告:马科斯知道,中国动真格了

阿库财经
2026-05-26 09:09:27
苏超口碑大反转!球员因为“淫乱”行为被内部处理,已经不是秘密

苏超口碑大反转!球员因为“淫乱”行为被内部处理,已经不是秘密

酷侃体坛
2026-05-26 18:11:31
毛主席原定1950年举行开国大典,斯大林得知后当场变脸警告刘少奇:必须立刻改期!

毛主席原定1950年举行开国大典,斯大林得知后当场变脸警告刘少奇:必须立刻改期!

寄史言志
2026-05-09 19:13:45
普京遗憾返程,谈了二十年都没戏,中国这次要俄认清一个事实

普京遗憾返程,谈了二十年都没戏,中国这次要俄认清一个事实

小兰聊历史
2026-05-26 12:38:58
前球员:兼具KD投射与乔丹、科比的气质,文班拥有一切GOAT潜质

前球员:兼具KD投射与乔丹、科比的气质,文班拥有一切GOAT潜质

懂球帝
2026-05-26 20:40:30
74岁布丽吉特:为了马克龙,整容扮嫩撑了9年,如今终于可以解脱

74岁布丽吉特:为了马克龙,整容扮嫩撑了9年,如今终于可以解脱

毒舌小红帽
2026-05-14 16:09:46
你认可吗!手机系统流畅度最新排名:OPPO继续第一、小米澎湃OS升至第3

你认可吗!手机系统流畅度最新排名:OPPO继续第一、小米澎湃OS升至第3

快科技
2026-05-26 16:26:50
老公偷偷改我刹车系统,我装不知道,第二天小姑子跑来找我借车

老公偷偷改我刹车系统,我装不知道,第二天小姑子跑来找我借车

千秋文化
2026-05-14 20:19:05
5700亿方淡水白白流走?中方砸万亿截弯取直,把西北“喂成”江南

5700亿方淡水白白流走?中方砸万亿截弯取直,把西北“喂成”江南

古事寻踪记
2026-05-25 07:07:29
我国已累计发布1750项食品安全标准

我国已累计发布1750项食品安全标准

北青网-北京青年报
2026-05-26 07:35:02
是不是活该?哈林不听劝执意参加“歌手”节目,首轮即被淘汰…

是不是活该?哈林不听劝执意参加“歌手”节目,首轮即被淘汰…

慧翔百科
2026-05-25 11:45:45
2026-05-26 21:23:00
IT架构师联盟 incentive-icons
IT架构师联盟
IT架构实战分享
842文章数 7672关注度
往期回顾 全部

科技要闻

中国AI要向外卷,而不只是做第二个OpenAI

头条要闻

山西矿难幸存者拒绝家人"不再下矿"要求:债还没还完

头条要闻

山西矿难幸存者拒绝家人"不再下矿"要求:债还没还完

体育要闻

上赛季差点降入英甲,下赛季要踢英超了

娱乐要闻

台媒贴脸!S妈被问大S嗑药当场沉默

财经要闻

中国铝行业爆单 下一个“煤炭”大周期?

汽车要闻

涉水加强 福特烈马亚马逊限量版上市 售价39.98万

态度原创

手机
艺术
亲子
健康
军事航空

手机要闻

荣耀600e中端手机今日海外发布

艺术要闻

中国之美,美到极致!

亲子要闻

儿童高热惊厥抽搐,急救记好这六点

外泌体抗衰,什么时候能用上?

军事要闻

美伊在阿巴斯港附近短暂交火 交战过程披露

无障碍浏览 进入关怀版