Springboot与RabbitMQ消息超时时间、队列消息超时时间

简介: Springboot与RabbitMQ消息超时时间、队列消息超时时间

一 TTL(过期时间)

TTL是 Time-To-Live 的缩写,RabbitMQ可以对消息和队列设置TTL(过期时间)。

RabbitMQ针对队列中的消息过期时间(Time To Live, TTL)有两种方法可以设置。

第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。

第二种方法是对消息进行单独设置,每条消息TTL可以不同。如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。消息在队列的生存时间一旦超过设置的TTL值,就成为dead message,消费者将无法再收到该消息。

二 单条消息设置TTL(超时时间)

针对单条消息设置TTL的方法是MessagePostProcessor对象里setExpiration(过期时间)

  1. 当队列消息的TTL 和消息TTL都被设置,时间短的TTL设置生效。
  2. 为消息设置TTL有一个问题:RabbitMQ只对处于队头的消息判断是否过期(即不会扫描队列),所以,很可能队列中已存在死消息,但是队列并不知情。这会影响队列统计数据的正确性,妨碍队列及时释放资源。
rabbitTemplate.convertAndSend("timeOut.exchange.test","key.time.out",messageProperties,
   // 设置消息过期时间: 单位:毫秒
       message1 -> {
       message1.getMessageProperties().setExpiration("10000");// 过期时间
       message1.getMessageProperties().setDeliveryMode(MessageDeliveryMode.fromInt(2)); // 持久化
   // 返回消息对象
       return message1;
       },correlationData);

对消息设置过期时间

// 为消息设置过期时间
message1.getMessageProperties().setExpiration("10000");// 过期时间

每条消息的过期时间不同,如果要删除所有过期消息,势必要扫描整个队列,所以不如等到此消息即将被消费时再判定是否过期,如果过期,再进行删除。

三 队列设置TTL(超时时间)

通过队列属性设置消息TTL,在声明队列方法中加入x-message-ttl参数实现的,这个参数的单位是毫秒。

  • 过期时间单位也是毫秒,但是与消息TTL不同在于 队列TTL值必须大于零
/* 设置队列过期时间*/
@Bean
public Exchange queueTimeOutExchange(){
    return new DirectExchange("queueTimeOut.exchange.test",true,false);
}
// 声明过期的队列并定义队列名称
@Bean
public Queue queueTimeOutQueue(){
    // 消息过期 特殊的args
    Map<String,Object> args  = new HashMap<>(16);
    // 存活时间最大为 20 秒
    args.put("x-message-ttl",20000);
      // 设置队列可以存储的最大消息数量
    args.put("x-max-length", 10);
    return new Queue("queueTimeOut.queue.test"
            ,true,false,false,args);
}
@Bean
public Binding queueTimeOutBinding(){
    return new Binding("queueTimeOut.queue.test",
            Binding.DestinationType.QUEUE,
            "queueTimeOut.exchange.test",
            "key.queuetime.out",null);
}

对队列设置过期时间

@Bean
public Queue queueTimeOutQueue(){
    // 消息过期 特殊的args
    Map<String,Object> args  = new HashMap<>(16);
    // 存活时间最大为 20 秒
    args.put("x-message-ttl",20000);
      // 设置队列可以存储的最大消息数量
    args.put("x-max-length", 10);
    return new Queue("queueTimeOut.queue.test"
            ,true,false,false,args);
}

一旦消息过期,就会从队列中抹去。因为队列中已过期的消息肯定在队列头部,RabbitMQ只要定期从队头开始扫描是否有过期消息即可。


相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
4月前
|
消息中间件 Ubuntu Java
SpringBoot整合MQTT实战:基于EMQX实现双向设备通信
本教程指导在Ubuntu上部署EMQX 5.9.0并集成Spring Boot实现MQTT双向通信,涵盖服务器搭建、客户端配置及生产实践,助您快速构建企业级物联网消息系统。
1956 1
|
4月前
|
消息中间件 Java Kafka
消息队列比较:Spring 微服务中的 Kafka 与 RabbitMQ
本文深入解析了 Kafka 和 RabbitMQ 两大主流消息队列在 Spring 微服务中的应用与对比。内容涵盖消息队列的基本原理、Kafka 与 RabbitMQ 的核心概念、各自优势及典型用例,并结合 Spring 生态的集成方式,帮助开发者根据实际需求选择合适的消息中间件,提升系统解耦、可扩展性与可靠性。
332 1
消息队列比较:Spring 微服务中的 Kafka 与 RabbitMQ
|
4月前
|
消息中间件 存储 Java
RabbitMQ 和 Spring Cloud Stream 实现异步通信
本文介绍了在微服务架构中,如何利用 RabbitMQ 作为消息代理,并结合 Spring Cloud Stream 实现高效的异步通信。内容涵盖异步通信的优势、RabbitMQ 的核心概念与特性、Spring Cloud Stream 的功能及其与 RabbitMQ 的集成方式。通过这种组合,开发者可以构建出具备高可用性、可扩展性和弹性的分布式系统,满足现代应用对快速响应和可靠消息传递的需求。
286 2
RabbitMQ 和 Spring Cloud Stream 实现异步通信
|
8月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
287 32
|
7月前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
1474 0
|
编解码 NoSQL Java
使用Spring Boot + Redis 队列实现视频文件上传及FFmpeg转码的技术分享
【8月更文挑战第30天】在当前的互联网应用中,视频内容的处理与分发已成为不可或缺的一部分。对于视频平台而言,高效、稳定地处理用户上传的视频文件,并对其进行转码以适应不同设备的播放需求,是提升用户体验的关键。本文将围绕使用Spring Boot结合Redis队列技术来实现视频文件上传及FFmpeg转码的过程,分享一系列技术干货。
989 4
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
335 6
|
消息中间件 存储 监控
RabbitMQ 队列之战:Classic 和 Quorum 的性能洞察
RabbitMQ 是一个功能强大的消息代理,用于分布式应用程序间的通信。它通过队列临时存储消息,支持异步通信和解耦。经典队列适合高吞吐量和低延迟场景,而仲裁队列则提供高可用性和容错能力,适用于关键任务系统。选择哪种队列取决于性能、持久性和容错性的需求。
995 6