首页 > 编程语言 >JAVA-MQ设置动态的过期队列

JAVA-MQ设置动态的过期队列

时间:2024-12-17 17:59:01浏览次数:6  
标签:JAVA 过期 队列 死信 MQ 设置 msg 时间 message

在开发场景中,如预约的签到,用户会有不同的预约签到时间,例如;7:00,7:30,8:00

那么,对于这种场景,使用如定点轮询查表的方式,一方面时间颗粒度需要严格的控制,另一方面在数据库的记录一多就很浪费性能,所以我们可以考虑使用mq的过期队列来实现功能

基于mq的死信队列,首先将信息存活时间设置为 "从当前时间到需要的判断的截止时间" -> "在项目中编写方法监听死信队列" 这样就是一个动态设置的理论基础,ok,理论形成,我们来看看在配置,和一些小部分的细节

配置上,首先你需要 一个正常的交换机,一个正常的队列,将队列绑定到对应的交换机上,同时定义一个死信交换机和死信队列,同样先将死信队列绑定上死信队列,最后一定记得把死信队列绑定上正常的交换机 (以上就是理论的配置流程 至于路由键的设置就更具实际情况来设置并不是强制需要的配置)

为了实现动态的过期时间,在定义队列时,需要我们手动设置一个极大的过期时间

 // 创建队列
 @Bean
 public Queue queueLog() {
      Map<String, Object> args = new HashMap<>();
      args.put("x-message-ttl", TTL_MAX); // 设置消息最大存活时间为 24h
      args.put("x-dead-letter-exchange", EXCHANGE_DLX_LOG); // 设置死信交换机
      args.put("x-dead-letter-routing-key", ROUTING_KEY_LOG); // 设置死信路由键

      return QueueBuilder.durable(QUEUE_LOG).withArguments(args).build();
 }

这里的TTL_MAX 我设置的就是24h(信息时间的单位是毫秒,在设置时间时记得换算一下)

在信息的发送上按以下代码为示例,需要以AmqpTemplate 类型一个实例化的mq工具

计算现在时间到目标时间 的时间差(注意单位换算,毫秒)

@Autowired
    private AmqpTemplate rabbitTemplate;

  /*
    *   发送消息 验证签到
    * */
    public void sendLogMessage(String message) {
        log.info("发送消息:" + message + "到签到队列");

        QueryWrapper<ReservationsDTO> qw = new QueryWrapper<>();
        qw.eq("reservation_id", message);
        ReservationsDTO dto = reservationsMapper.selectOne(qw);

        MessageProperties messageProperties = new MessageProperties();
        // 获取 startTime
        LocalDateTime startTime = dto.getStartTime();

        // 计算当前时间到 startTime 的时间差
        Duration duration = Duration.between(LocalDateTime.now(), startTime);
        //这里可能存在负数情况,虽然正常情况不会有 防范于未然
        if(duration.isNegative()) {
            log.error(message + "签到时间已过....");
            duration = Duration.ZERO;
        }

        long expirationTimeMinutes = duration.toMillis(); // 转换为毫秒
        messageProperties.setExpiration(String.valueOf(expirationTimeMinutes));
        
       // 第一个位置是队列名称,信息,和设置的过期时间
        rabbitTemplate.convertAndSend(RabbitMQ.EXCHANGE, message, msg -> {
            msg.getMessageProperties().setExpiration(messageProperties.getExpiration());
            return msg;
        });

// 如果你需要路由键设置 按下面这个来即可

/**
* rabbitTemplate.convertAndSend(RabbitMQ.EXCHANGE,"路由键", message, msg -> {
*           msg.getMessageProperties().setExpiration(messageProperties.getExpiration());
*           return msg;
*       });
*
*/
    }

注意 你设置的过期时间不要超过你配置的最大过期时间,所以在设置的时间就考虑好极端情况的最大时间是多少,最后在你的消费者监听对应的死信队列,正常编写业务逻辑即可

标签:JAVA,过期,队列,死信,MQ,设置,msg,时间,message
From: https://blog.csdn.net/2301_79425914/article/details/144372955

相关文章

  • java面试问题(2024.12.17)
    记录java岗面试问题对java的了解Java是一门面向对象的编程语言,吸收了C++语言中大量的优点,但又抛弃了C++中容易出错的地方,如垃圾回收。Java又是一门平台无关的编程语言,通过java虚拟机(jvm)可以实现一次编译,处处运行。对jvm的了解Java虚拟机,是Java实现跨平台的关键所......
  • 基于java中的SSM框架实现个人博客网站平台项目【内附项目源码+论文说明】
    基于java中的SSM框架实现个人博客网站管理平台演示【内附项目源码+LW说明】摘要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对文章和相册分享信息管理混乱,......
  • 基于java中的SSM框架实现高校共享单车管理系统项目【内附项目源码+论文说明】
    基于java中的SSM框架实现高校共享单车管理系统演示【内附项目源码+LW说明】摘要网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就......
  • 基于java中的SSM框架实现个人博客网站平台项目【附项目源码+论文说明】
    基于java中的SSM框架实现个人博客网站管理平台演示【内附项目源码+LW说明】摘要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对文章和相册分享信息管理混乱......
  • 基于java中的SSM框架实现会员管理系统平台项目【附项目源码+论文说明】
    基于java中的SSM框架实现会员管理系统演示【内附项目源码+LW说明】摘要随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于会员管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了会员管理系统,它彻底改变了过去传统的管理方......
  • 基于Java中的SSM框架实现面向学生成绩分析系统项目【项目源码+论文说明】计算机毕业设
    摘要在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括面向学生成绩分析系统的网络应用,在外国面向学生成绩分析系统已经是很普遍的方式,不过国内的面向学生成绩分析系统可能还处于起步阶段。面向学生成绩分析系统具有面向学生成绩分析信息管理功能的选......
  • Java深入理解深拷贝和浅拷贝区别
    一、拷贝的引入(1)、引用拷贝创建一个指向对象的引用变量的拷贝。publicclassQuoteCopy{publicstaticvoidmain(String[]args){Teacherteacher=newTeacher("riemann",28);TeacherotherTeacher=teacher;System.out.println(teach......
  • 基于Java中的SSM框架实现理发店管理系统项目【项目源码+论文说明】
    摘要随着信息化时代的到来,管理系统都趋向于智能化、系统化,理发店管理系统也不例外,但目前国内的市场仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时代的变化,而理发店管理系统能很好地解决这一问题,轻松应对理发店管理的工作,既能提高人力物力......
  • 基于Java中的SSM框架实现美容院管理系统项目【项目源码+论文说明】
    摘要首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计......
  • java复学——一步步走
    idea创建一个mavenwebapp空项目,手动配置springmvc教程<dependencies><!--springMVC坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId>......