《RabbitMQ》什么是死信队列
字节传说
共 5767字,需浏览 12分钟
· 2020-08-13
一 什么是死信队列
当一条消息在队列中出现以下三种情况的时候,该消息就会变成一条死信。
消息被拒绝(basic.reject / basic.nack),并且requeue = false
消息TTL过期
队列达到最大长度
当消息在一个队列中变成一个死信之后,如果配置了死信队列,它将被重新publish到死信交换机,死信交换机将死信投递到一个队列上,这个队列就是死信队列。
二 实现死信队列
2.1 原理图
2.2 创建消费者
创建一个消费者,绑定消费队列及死信交换机,交换机默认为direct
模型,死信交换机也是,arguments绑定死信交换机和key。(注解支持的具体参数文末会附上)
public class DirectConsumer {
@RabbitListener(bindings = {
@QueueBinding(value = @Queue(value = "javatrip",arguments =
{@Argument(name="x-dead-letter-exchange",value = "deadExchange"),
@Argument(name="x-dead-letter-routing-key",value = "deadKey")
}),
exchange = @Exchange(value="javatripDirect"),
key = {"info","error","warning"}
)
})
public void receive1(String message, @Headers Map headers, Channel channel) throws Exception{
System.out.println("消费者1"+message);
}
2.3 创建生产者
public void publishMessage(String message){
rabbitTemplate.setMandatory(true);
rabbitTemplate.convertAndSend("javatripDirect","info",message);
}
三 造成死信的三种情况
3.1 拒绝消息,并且禁止重新入队
设置yml为手动签收模式
spring:
rabbitmq:
listener:
simple:
acknowledge-mode: manual
设置拒绝消息并禁止重新入队
Long deliverTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);
channel.basicNack(deliverTag,false,false);
绑定死信队列
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue(value = "javatripDead"),
exchange = @Exchange(value = "deadExchange"),
key = "deadKey"
)
})
public void receive2(String message){
System.out.println("我是一条死信:"+message);
}
3.2 消息TTL过期
绑定业务队列的时候,增加消息的过期时长,当消息过期后,消息将被转发到死信队列中。
@RabbitListener(bindings = {
@QueueBinding(value = @Queue(value = "javatrip",arguments =
{@Argument(name="x-dead-letter-exchange",value = "deadExchange"),
@Argument(name="x-dead-letter-routing-key",value = "deadKey"),
@Argument(name = "x-message-ttl",value = "3000")
}),
exchange = @Exchange(value="javatripDirect"),
key = {"info","error","warning"}
)
})
public void receive1(String message, @Headers Map headers, Channel channel) throws Exception{
System.out.println("消费者1"+message);
}
3.3 队列达到最大长度
设置消息队列长度,当队列中的消息达到最大长度后,继续发送消息,消息将被转发到死信队列中。
@RabbitListener(bindings = {
@QueueBinding(value = @Queue(value = "javatrip",arguments =
{@Argument(name="x-dead-letter-exchange",value = "deadExchange"),
@Argument(name="x-dead-letter-routing-key",value = "deadKey"),
@Argument(name = "x-max-length",value = "3")
}),
exchange = @Exchange(value="javatripDirect"),
key = {"info","error","warning"}
)
})
public void receive1(String message, @Headers Map headers, Channel channel) throws Exception{
System.out.println("消费者1"+message);
}
四 Spring Boot整合RabbitMQ用到的几个注解
@QueueBinding作用就是将队列和交换机进行绑定,主要有以下三个参数:
@Target({})
@Retention(RetentionPolicy.RUNTIME)
public @interface QueueBinding {
/**
* @return the queue.
*/
Queue value();
/**
* @return the exchange.
*/
Exchange exchange();
/**
* @return the routing key or pattern for the binding.
* Multiple elements will result in multiple bindings.
*/
String[] key() default {};
}
@Queue是声明队列及队列的一些属性,主要参数如下:
@Target({})
@Retention(RetentionPolicy.RUNTIME)
public @interface Queue {
/**
* @return the queue name or "" for a generated queue name (default).
*/
@AliasFor("name")
String value() default "";
/**
* @return the queue name or "" for a generated queue name (default).
* @since 2.0
*/
@AliasFor("value")
String name() default "";
/**
* 是否持久化
*/
String durable() default "";
/**
* 是否独享、排外的.
*/
String exclusive() default "";
/**
* 是否自动删除;
*/
String autoDelete() default "";
/**
* 队列的其他属性参数
* (1)x-message-ttl:消息的过期时间,单位:毫秒;
*(2)x-expires:队列过期时间,队列在多长时间未被访问将被删除,单位:毫秒;
*(3)x-max-length:队列最大长度,超过该最大值,则将从队列头部开始删除消息;
*(4)x-max-length-bytes:队列消息内容占用最大空间,受限于内存大小,超过该阈值则从队列头部开始删除消 * 息;
*(5)x-overflow:设置队列溢出行为。这决定了当达到队列的最大长度时消息会发生什么。有效值是drop- * head、reject-publish或reject-publish-dlx。仲裁队列类型仅支持drop-head;
*(6)x-dead-letter-exchange:死信交换器名称,过期或被删除(因队列长度超长或因空间超出阈值)的消息 * 可指定发送到该交换器中;
*(7)x-dead-letter-routing-key:死信消息路由键,在消息发送到死信交换器时会使用该路由键,如果不设 * 置,则使用消息的原来的路由键值
*(8)x-single-active-consumer:表示队列是否是单一活动消费者,true时,注册的消费组内只有一个消费 * 者消费消息,其他被忽略,false时消息循环分发给所有消费者(默认false)
*(9)x-max-priority:队列要支持的最大优先级数;如果未设置,队列将不支持消息优先级;
*(10)x-queue-mode(Lazy mode):将队列设置为延迟模式,在磁盘上保留尽可能多的消息,以减少RAM的使 * 用;如果未设置,队列将保留内存缓存以尽可能快地传递消息;
*(11)x-queue-master-locator:在集群模式下设置镜像队列的主节点信息。
*/
Argument[] arguments() default {};
}
@Exchange是声明交换及交换机的一些属性,
@Target({})
@Retention(RetentionPolicy.RUNTIME)
public @interface Exchange {
String TRUE = "true";
String FALSE = "false";
/**
* @return the exchange name.
*/
@AliasFor("name")
String value() default "";
/**
* @return the exchange name.
* @since 2.0
*/
@AliasFor("value")
String name() default "";
/**
* 交换机类型,默认DIRECT
*/
String type() default ExchangeTypes.DIRECT;
/**
* 是否持久化
*/
String durable() default TRUE;
/**
* 是否自动删除
*/
String autoDelete() default FALSE;
/**
* @return the arguments to apply when declaring this exchange.
* @since 1.6
*/
Argument[] arguments() default {};
}
评论
周鸿祎是真牛逼
最近在各个视频平台,我的推荐信息流上一定会出现红衣教主周鸿祎的身影,俨然是新一代的顶流IP网红,还是自己贼有钱的那种。不得不说,周鸿祎是真牛逼,他是懂得学习的。年初的时候,他就发文:“如今已是网红时代,我现在已经拜了俞敏洪为师,在学习如何当网红,每天勤奋的发短视频”。“有时候也在劝很多亚布力大哥级
公子龙
1
Windows格式化对话框是一个使用了30年的 “临时解决方案”
戴夫-普卢默(Dave Plummer)是微软的资深工程师,曾创造了任务管理器、Windows 弹球、原生 ZIP 支持(微软出钱买断该功能后,他用这笔钱购买了一辆红色克尔维特)等传奇。近日他在自己的 X 账户上分享了创建 "格式化" 对话框的故事 —— 称其是一个使用了长达 30 年的 “临时解决
开源Linux
0
OpenAI的Sora竟然造假:生成的AI大片只有1%的AI,剩下的99%是人工!
点蓝色字关注“机器学习算法工程师”设为星标,干货直达!啊?Sora火爆短片《气球人》,也“造假”了???背后艺术家团队的最新揭秘,可谓一石激起千层浪:原来,视频画面并非完全由AI生成,其中有大量视觉效果需要人类后期实现。be like:这下网友不干了,合着大家伙儿跟OpenAI玩真心,OpenAI背
机器学习算法工程师
1
李彦宏:开源大模型不如闭源,后者会持续领先;周鸿祎:“开源不如闭源” 的言论是胡说八道
架构师大咖
架构师大咖,打造有价值的架构师交流平台。分享架构师干货、教程、课程、资讯。架构师大咖,每日推送。
公众号该公众号已被封禁0、李彦宏:开源大模型不如闭源,后者会持续领先当今
源码共读
0
宇宙的尽头是编制?985高校硕士拟聘遗体火化工疯传!
本文来源:大皖新闻、潇湘晨报、南都街谈、超级数学建模、创业邦4月22日,广州市民政局网站发布的《广州市民政局直属事业单位2023年第一次公开招聘工作人员拟聘用人员公示(第一批)》引发舆论关注。名单中有毕业于香港中文大学的刘某拥有研究生学历,专业为哲学(佛学研究),另外二人本科分别毕业于华南理工大学建
机器学习初学者
0
Go早期是如何在Google内部发展起来的
2007年Go诞生于Google,2009年Google正式对外宣布了Go语言的开源!时至今日,距离Go开源已经过去了近15个年头了[1]!Go在Google公司内部究竟是怎样的一个状态呢?前Google员工Yves Junqueira近期撰文从其个人所见所闻谈了Go在Google的历程[2]!这里
GoCN
0
美国司法部重判币安创始人CZ,他到底做错了什么?
注:4月24日,美国司法部表示币安创始人兼前首席执行官赵长鹏应在监狱服刑三年(36个月),根据给出的理由显示,美国司法部律师认为赵长鹏帮助币安违反联邦制裁和洗钱法,并称其必须付出更大的代价,所以应该提高刑期。就在审判前,CZ在写给负责此案件的法官理查德· A · 琼斯的一封信中,为自己的「错误决定」
区块链头条
3
【比特币减半后价格表现大揭秘】历史数据告诉你什么?
加密货币现状的十张图表Glassnode 和 Coinbase 发布了《加密货币市场指南》,这是一个季度系列,旨在提供对加密货币市场主要发展的详细分析。以下是报告中引起我们注意的10张图表:1.比特币主导地位从50%上升至52%通常由减半引发的山寨季会降低比特币的主导地位,使其更倾向于新的山寨币。这
区块链头条
0