这里写目录标题

  • 一:TTL队列过期时间设置
  • 二:TTL消息过期时间设置
  • 三:死信队列

- 第一种是声明队列的时候,在队列的属性中设置,这样该队列中的消息都会有相同的有效期;
-第二种是发送消息时给消息设置属性,可以为每条消息都设置不同的TTL。
如果两种方式都设置了,则以设置的较小的为准。

TTL是:Time To Live的缩写 , 也就是生存时间
RabbitMQ支持消息的过期时间,在消息发送时可以进行指定
RabbitMQ支持为每个队列设置消息的超时时间,从消息入队列开始计算只要超过了队列的超时时间的配置,那么消息会自动的清除

一:TTL队列过期时间设置

第一步配置好自己的yml

spring:rabbitmq:host: 192.168.192.168port: 5672virtual-host: /username: guestpassword: guest

创建生产者

@Component
public class TtlProducer {@Autowiredprivate RabbitTemplate rabbitTemplate;public void makeTTL(String a,String b,int c){String Exchange = "TTLExchange";String TTL = "ttl";String message = UUID.randomUUID().toString();System.out.println("消息来了~~~~~"+message);//参数一:交换机,  参数二:key,  参数三:消息rabbitTemplate.convertAndSend(Exchange,TTL,message);}
}

创建消费者

@Configuration
public class TtlConsumer {@Bean//注册一个direct模式的交换机public DirectExchange directExchange(){return new DirectExchange("TTLExchange",true,false);}@Beanpublic Queue aaa(){HashMap<String, Object> args = new HashMap<>();//我们可以给这个队列设置一个时间args.put("x-message-ttl",5000);//表示5秒return new Queue("TTLQueue01.queue",true,false,false,args);}@Beanpublic Binding aaaBinding(){return BindingBuilder.bind(aaa()).to(directExchange()).with("ttl");}
}

运行

我们可以去web界面看

等5s后

二:TTL消息过期时间设置

发送消息时候给消息设置属性
可以为每条消息设置不同的TTL

第一步配置好自己的yml

spring:rabbitmq:host: 192.168.192.168port: 5672virtual-host: /username: guestpassword: guest

创建生产者

@Component
public class TTLProter {@Autowiredprivate RabbitTemplate rabbitTemplate;public void mekeMessage(String a,String b){String orderID = UUID.randomUUID().toString();System.out.println("消息~~~~"+orderID);String exchangeName ="ttl_direct_exchange";String luYouKey = "ttlmessage";MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {message.getMessageProperties().setExpiration("6000");message.getMessageProperties().setContentEncoding("UTF-8");return message;}};rabbitTemplate.convertAndSend(exchangeName,luYouKey,orderID,messagePostProcessor);}
}

创建消费者

@Configuration
public class TTLConerter {@Beanpublic DirectExchange directExchange() {return new DirectExchange("ttl_direct_exchange", true, false);}@Beanpublic Queue abcQueue() {return new Queue("ttl.message.direct.queue",true,false,false);}@Beanpublic Binding abcBinding(){return BindingBuilder.bind(abcQueue()).to(directExchange()).with("ttlmessage");}
}

测试

@SpringBootTest
class SpringBootRabbitmqTtl2ApplicationTests {@Autowiredpublic TTLProter ttlProter;@Testvoid contextLoads() {ttlProter.mekeMessage("1","2");}
}

三:死信队列

DLX是:可以称死信交换机。也可以称死信邮箱
利用DLX,当消息在一个队列中变成死信 (dead message) 之后,它能被重新publish到另一个Exchange,这个Exchange就是DLX

消息变成死信有以下几种情况

  • 消息被拒绝(basic.reject / basic.nack),并且requeue = false
  • 消息TTL过期
  • 队列达到最大长度

死信处理过程

  • 当消息在队列中变成死信之后
    它能被重新发送到另外一个交换机中
    这个交换机就是DLX
    绑定DLX的队列就成为死信队列

个人总结:死信队列其实就是给过期的消息 创建一个交换机和队列DLX
把那些销毁的信息投入DLX

第一步配置好自己的yml

spring:rabbitmq:virtual-host: /host: 192.168.192.168port: 5672username: guestpassword: guest

创建生产者

@Component
public class ttlProducer {@Autowiredprivate RabbitTemplate rabbitTemplate;public void makeTTL(String a, String b, int c) {String enchangeName = "ttlEnchange";String luyouKey = "ttl";String message = UUID.randomUUID().toString();System.out.println("消息消息消息!!!!"+message);rabbitTemplate.convertAndSend(enchangeName, luyouKey, message);}
}

创建死信队列
这个死信队列专门存放过期的消息

@Configuration
public class dlxBase {@Beanpublic DirectExchange DlxExchange(){return new DirectExchange("dead.dlx.Exchange",true,false);}@Beanpublic Queue bbbQueue(){return new Queue("bbb.Queue.dead");}@Beanpublic Binding bbbBinding(){return BindingBuilder.bind(bbbQueue()).to(DlxExchange()).with("dead");}
}

创建队列过期时间

@Configuration
public class ttlConsumer {@Beanpublic DirectExchange directExchange(){return new DirectExchange("ttlEnchange",true,false);}@Beanpublic Queue aaaQueue(){HashMap<String, Object> args = new HashMap<>();args.put("x-message-ttl",5000);args.put("x-dead-letter-exchange","dead.dlx.Exchange");//绑定你创建的死信交换机args.put("x-dead-letter-routing-key","dead");//绑定你的死信交换机的keyreturn new Queue("aaa.Queue.ttl",true,false,false,args);}@Beanpublic Binding aaaBinding(){return BindingBuilder.bind(aaaQueue()).to(directExchange()).with("ttl");}
}

测试:

@SpringBootTest
class SpringBootRabbitmqSiApplicationTests {@Autowiredprivate ttlProducer ttlProducer;@Testvoid contextLoads() {ttlProducer.makeTTL("a","b",3);}
}


我们可以去web界面看
消息队列设置的是5秒过期时间
看看我们过期的消息是否进入到死信队列


学习是一步一步来的不要跳过
如果这里有很多代码没有看懂-可以去学学前面的知识RabbitMQ基础大全

RabbitMQ的TTL+死信队列 看完这篇包会!!!相关推荐

  1. 互联网黑话最全收录|还在说大白话?看完这篇包你成为职场“社牛”

    文章目录 互联网黑话是怎么产生的? 互联网黑话是好是坏? 互联网黑话入门级教学指南 写在最后 刚刚加入字节时,比起高强度.快节奏的工作,最先迎面而来的不适应居然是--沟通障碍! "你说这话的 ...

  2. RabbitMQ,Springboot整合RabbitMQ实现 消息可靠性投递,Consumer ACK,TTL,死信队列,使用TTL+死信队列=延迟队列

    搭建SpringBoot项目,用于演示 springboot版本 <!-- spring boot --><dependency><groupId>org.spri ...

  3. springboot 与rabbitmq集成+生产者投递确认+消费者手动确认+TTL+死信队列+延时队列

    1.生产者的消息可靠性投递机制 1)springboot yml文件配置 spring:rabbitmq:host: 10.0.23.83username: lifwepassword: 123456 ...

  4. RabbitMQ高级特性——死信队列DLX以及代码测试

    大伙可以到我的RabbitMQ专栏获取更多信息 demo示例这里拿 概述 死信队列,缩写DLX(dead letter exchange 死信交换机),当消息称为dead message之后,会被重新 ...

  5. redis hashmap过期_看完这篇再也不怕 Redis 面试了

    0.前言 Redis是跨语言的共同技术点,无论是Java还是C++都会问到,所以是个高频面试点. 笔者是2017年才开始接触Redis的,期间自己搭过单机版和集群版,不过现在 大一些的 公司都完全是运 ...

  6. 看完这篇再也不怕 Redis 面试了

    看完这篇再也不怕 Redis 面试了 0x00.前言 Redis是跨语言的共同技术点,无论是Java还是C++都会问到,所以是个高频面试点. 笔者是2017年才开始接触Redis的,期间自己搭过单机版 ...

  7. 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?...

    简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...

  8. 第六十二期:看完这篇还不了解Nginx,那我就哭了!

    看完这篇还不了解Nginx,那我就哭了! Nginx 同 Apache 一样都是一种 Web 服务器.基于 REST 架构风格,以统一资源描述符(Uniform Resources Identifie ...

  9. 看完这篇文章,还不懂nginx,算我输

    看完这篇文章,还不懂nginx,算我输 参考:https://mp.weixin.qq.com/s/PeNWaCDf_6gp2fCQa0Gvng 1. Nginx产生~ Nginx 同 Apache ...

最新文章

  1. 博客堂也遇DotText经典Exception
  2. 使用Java让android手机自动执行重复重启
  3. Java(发布/订阅模式)
  4. 自定义汇编程序,Weaver和运行时的可插拔知识
  5. Spring Boot + JPA + Freemarker 实现后端分页 完整示例
  6. Java(1-15)
  7. NISP第一讲信息安全和网络空间安全
  8. Linux小游戏——单机掷骰子
  9. hdu5963 朋友
  10. [ XJTUSE ]JAVA语言基础知识——2.2 Java基本数据类型
  11. [ java ] 坦克大战 5.0 ~ 最终完整版
  12. FLP不可能原理(转)
  13. (PKCS1) RSA 公私钥 pem 文件 提取 公私钥 e d 和 模数 n
  14. 蓝桥杯1——李白打酒加强版
  15. 全国计算机等级考试office无纸化考试,2017年无纸化考试专用 全国计算机等级考试一本通 一级计算机基础及MS Office应用...
  16. 2015考研数学复习全书【数一】
  17. 在家远程使用公司用友ERP财务软件 【远程办公】
  18. FY3b MWRI亮温数据处理
  19. RockChip px3se 使用wpa_spplicant连接wifi上网
  20. 推荐几个好看的emacs主题(emacs颜值党)

热门文章

  1. Android持久化存储(3)SQLite数据库的使用
  2. 关于DEBUG的一点体会
  3. 晶科能源与森源电气签订300MW光伏组件供货协议
  4. 人的价值不在于能力,而在于位置 » 社区 | Ruby China
  5. 浏览器外部署Silverlight更新检查失败的原因及对策
  6. 朴素贝叶斯—疾病的预测
  7. MUI框架之输入框Input
  8. java 实现输出姓和名
  9. ASP.NET Web API教程 分页查询
  10. 放弃广告 反思站长收益来源