RabbitMQ在SpringBoot中的高级应用(2)

过期时间

        1.单独的设置队列的存活时间,队列中的所有消息的过期时间一样

    @Bean//创建交换机
    public DirectExchange ttlQueueExchange(){
        // 交换机名称      是否持久化        是否自动删除
        return new DirectExchange("ttl_queue_log",true,false);
    }

    @Bean//创建队列
    public Queue ttlQueue(){
        Map<String, Object> map = new HashMap<>();
        map.put("x-message-ttl",30000);//表示当前队列的存活时间
        map.put("x-max-length",1000);//最大容量
        map.put("x-min-length",0);//最小容量
        //1.队列名称 2.是否持久化 3.是否唯一绑定某一个交换机  4.是否自动删除 5.给当前的队列配置初始化参数(存活时间,最大容量,最小容量)
        return new Queue("tt_queue",true,false,false,map);
    }

    //将队列和交换机进行绑定
    @Bean
    public Binding bingCreate(){                                                        //绑定的路由键
        return BindingBuilder.bind(ttlQueue()).to(ttlQueueExchange()).with("ttl_queue_key");
    }
   @Test//队列的过期时间
    public void ttlQueue(){
        re.convertAndSend("ttl_queue_log","ttl_queue_key","这是过期的消息");
    }

        消息队列是在接收消息的30s才会过期,当然,这个时间也可以在创建队列的时候更改

            在队列没有失效之前可以看到队列里的消息,过期后查看就是空数据

 

 2. 对每一条消息单独设置过期时间

    @Bean
    public DirectExchange ttlMessageExchange(){
          return new DirectExchange("ttl_message_exchange",true,false);
    }
    @Bean
    public Queue ttlMessage(){
         return new Queue("ttl_message",true,false,false,null);
    }
    @Bean
    public Binding bindingTtl(){
          return BindingBuilder.bind(ttlMessage()).to(ttlMessageExchange()).with("mk");
    }
        注意到这个包:import org.springframework.amqp.core.*;

                在发送消息的时候设置消息的过期时间

    @Test//消息的过期时间   消息
    public void ttlQueueMessage(){
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setExpiration("30000");//设置存活时间 ms
        Message message = new Message("你好,这是消息的过期时间".getBytes(),messageProperties);
        re.convertAndSend("ttl_message_exchange","mk",message);
    }

         在设置过期时间内我们可以在ttl_message队列中查看到消息,等超过该时间也会查询不到消息

 

死信队列

        死信队列和普通的队列一样,只是用来独特的信息,比如:被拒绝接收的消息,未被处理的过期消息,超过最大的存储的消息

        1.编写核心配置文件application.properties

#开启手动签收(手动ACK)
spring.rabbitmq.listener.simple.acknowledge-mode=manual
# 设置消息被拒绝后,不在重新入队
spring.rabbitmq.listener.simple.default-requeue-rejected=false
# 设置消费者需要手动确认消息
spring.rabbitmq.listener.direct.acknowledge-mode=manual

             2.创建交换机和队列并绑定

    @Bean//创建一个死信交换机
    public DirectExchange dealExchange(){
          return new DirectExchange("dead_letter_exchange",true,false,null);
    }
    @Bean//创建死信队列
    public Queue dealQueue(){
          return new Queue("dead_letter",true,false,false,null);
    }
    @Bean//绑定死信队列和死信消息
    public Binding bindDead(){
          return BindingBuilder.bind(dealQueue()).to(dealExchange()).with("dead_log");
    }

    @Bean//创建业务层交换机
    public DirectExchange businessExchange(){
          return new DirectExchange("business_exchange",true,false,null);
    }

    @Bean//普通的队列
    public Queue testQueue(){
          HashMap<String, Object> map = new HashMap<>();
        map.put("x-dead-letter-exchange","dead_letter_exchange");//配置死信交换机
        map.put("x-dead-letter-routing-key","dead_log");//设置死信交换机和绑定队列之间的路由键
        return new Queue("test_queue",true,false,false,map);
    }
    @Bean//绑定业务处理机和普通队列
    public Binding testExchange(){
          return BindingBuilder.bind(testQueue()).to(businessExchange()).with("b_refuse");
    }

    @Bean//创建过期消息队列
    public Queue testttlQueue(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("x-dead-letter-exchange","dead_letter_exchange");
        map.put("x-dead-letter-routing-key","dead_log");
        map.put("x-message-ttl",30000);
          return new Queue("test_ttl",true,false,false,map );
    }
    @Bean//绑定业务处理机和过期消息队列
    public Binding testttl(){
          return BindingBuilder.bind(testttlQueue()).to(businessExchange()).with("d_ttl");
    }
    @Bean//溢出队列
    public Queue testMaxQueue(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("x-dead-letter-exchange","dead_letter_exchange");
        map.put("x-dead-letter-routing-key","dead_log");
        map.put("x-max-length",3);
        return new Queue("test_max",true,false,false,map );
    }
    @Bean//绑定业务处理机和溢出队列
    public Binding testMax(){
          return BindingBuilder.bind(testMaxQueue()).to(businessExchange()).with("t_max");
    }

           3.发送消息

    @Test//死信队列的消息  拒收
    public void refuseMessage(){
        re.convertAndSend("business_exchange","b_refuse","死信队列:消息被拒收");
    }
    @Test//死信队列的消息   过期
    public void refuseMessage1(){
        re.convertAndSend("business_exchange","d_ttl","死信队列:过期的消息");
    }
    @Test//死信队列的消息   溢出
    public void refuseMessage2(){
        for (int i = 1; i < 6; i++) {
            re.convertAndSend("business_exchange","t_max","死信队列:溢出的消息"+i);
        }
    }

         4.处理消息

    @RabbitListener(queues = "test_queue")
    public void refuseConsumer(String msg,Message messagem,Channel channel) throws IOException {
        channel.basicNack(messagem.getMessageProperties().getDeliveryTag(),false,false);
        System.out.println("消息被拒收:"+msg);
    }

             dead_letter死信队列,test_queue拒收队列 , test_ttl过期队列,test_max最大队列

          1拒收消息,我们将消息发送到 test_queue队列,但是消息被拒收,消息就会出现在死信队列中,所以我们死信队列中的信息为1,而拒绝队列为0

         2.过期消息,在消息没有过期的时候消息在test_ttl队列中,等到有效期结束后就会进入到死信队列

 

         3.消息溢出

 

延迟队列

        在队列中的消息是不需要立即消费的,需要等待一段时间时候才会取出消费,通过死信队列进行中转

        1.创建队列并绑定死信队列

    @Bean//创建延迟消息队列
    public Queue testDelayQueue(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("x-dead-letter-exchange","dead_letter_exchange");
        map.put("x-dead-letter-routing-key","dead_log");
        map.put("x-message-ttl",30000);
        return new Queue("test_deal",true,false,false,map );
    }
    @Bean//绑定业务处理机和过期延迟队列
    public Binding testdel(){
          return BindingBuilder.bind(testDelayQueue()).to(businessExchange()).with("d_deal");
    }

        2.发送消息

    @Test//延迟消息
    public void dealMessage(){
          re.convertAndSend("business_exchange","d_deal","延迟的消息:生于小满,小满为安" );
    }

        3.处理消息

    @RabbitListener(queues = "dead_letter")//监听死信队列
    public void deadLetter(Message message,Channel channel){
        byte[] body = message.getBody();

        System.out.println("延迟消息:" +new String(body));
    }

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/35913.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

吴恩达ChatGPT《LangChain for LLM Application Development》笔记

基于 LangChain 的 LLM 应用开发 1. 介绍 现在&#xff0c;使用 Prompt 可以快速开发一个应用程序&#xff0c;但是一个应用程序可能需要多次写Prompt&#xff0c;并对 LLM 的输出结果进行解析。因此&#xff0c;需要编写很多胶水代码。 Harrison Chase 创建的 LangChain 框…

需求分析引言:架构漫谈(五)架构师成长之路

我研发领域也从事了一些年&#xff0c;期间也做过一些架构设计工作&#xff0c;包括C#单体转型为Java微服务、Python单体转型为Java微服务等&#xff0c; 也尝试着从自己的经验角度&#xff0c;来汇总一些知识点&#xff0c;同时描述一下如何成长为一个合格的软件架构师&#x…

基于SpringBoot+Vue+微信小程序的电影平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 研究背景&#xff1a;…

Docker 中的 .NET 异常了怎么抓 Dump (转载)

一、背景 1. 讲故事 有很多朋友跟我说&#xff0c;在 Windows 上看过你文章知道了怎么抓 Crash, CPU爆高&#xff0c;内存暴涨 等各种Dump&#xff0c;为什么你没有写在 Docker 中如何抓的相关文章呢&#xff1f;瞧不上吗&#xff1f; 哈哈&#xff0c;在DUMP的分析旅程中&a…

提升工作效率:推荐几款实用的Mac项目管理工具!

在当今软件和技术高度发达的时代&#xff0c;项目管理依然是一项非常重要的任务。现在&#xff0c;有越来越多的人喜欢使用mac电脑进行项目管理&#xff0c;因为mac众所周知的稳定性和使用便捷性。但问题是&#xff0c;mac系统自带的项目管理工具并不是非常完美&#xff0c;因此…

Linux——进程信号详解

目录 一.进程信号的理解 1.1定义&#xff1a; 1.2举例&#xff1a; 1.3总结&#xff1a; 二.进程信号地使用&#xff1a; 2.1信号种类&#xff1a; 2.2而操作系统向进程发送信号地方式有四种&#xff1a; 2.2.1以键盘的方式向进程发送信号 接下来介绍一个系统调用函数sign…

Windows系统上安装Node.js图文步骤流程

Windows系统上安装Node.js图文步骤流程&#xff0c;本文以安装Node.js v4.4.3 LTS(长期支持版本)版本为例&#xff1a; 目录 Node.js下载 Windows 上安装 Node.js 1、Windows 安装包(.msi) 2、Windows 二进制文件 (.exe)安装 版本测试 Node.js下载 Node.js 安装包及源码…

nginx七层代理和四层转发的理解

先来理解一下osi七层模型 应用层 应用层是ISO七层模型的最高层&#xff0c;它直接与用户和应用程序交互&#xff0c;提供用户与网络的接口。它包括各种应用协议&#xff0c;如HTTP、FTP、SMTP等&#xff0c;用于实现特定应用的功能和通信表示层 表示层…

Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令

目录 ProcessBuilder类的介绍及使用 【前言】 【正文】 --构造方法-- --常用方法-- --使用技巧-- --调用本地Shell命令&#xff0c;实例-- 【总结】 【注意】 ProcessBuilder类的介绍及使用 【前言】 在做一个项目的时候需要用到运行时动态执行JAVA命令&#xff0c;一…

leetcode 225.用队列实现栈

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;用队列实现栈 1️⃣ 思路和图解&#xff1a; push&#xff1a; 入栈操作只需要往不为空的队列入数据即可&#xff0c;如果都为空&#xff0c;其中任意一个队列都可以。 void myStackPush(MyStack* obj, int x) {// 往…

CS EXE上线主机+文件下载上传键盘记录

前言 书接上文&#xff0c;CobaltStrike_1_部署教程及CS制作office宏文档钓鱼教程&#xff0c;该篇介绍【使用CS生成对应exe木马&#xff0c;上线主机&#xff1b;对上线主机进行&#xff0c;文件下载&#xff0c;文件上传&#xff0c;键盘记录】。 PS&#xff1a;文章仅供学习…

数仓建设中最常用模型--Kimball维度建模详解

数仓建模首推书籍《数据仓库工具箱&#xff1a;维度建模权威指南》&#xff0c;本篇文章参考此书而作。文章首发公众号&#xff1a;五分钟学大数据&#xff0c;公众号后台发送“维度建模”即可获取此书籍第三版电子书 先来介绍下此书&#xff0c;此书是基于作者 60 多年的实际业…

SpringBoot前后端分离项目,打包、部署到服务器详细图文流程

文章目录 实施步骤一、修改配置文件地址1.修改MySQL配置2.修改Redis配置3.修改日志路径和字符集配置 二、将源码压缩并上传服务器1.上传前端文件2.上传后端文件&#xff08;同上&#xff09; 三、前端项目打包1.安装依赖2.项目打包 四、后端项目打包1.项目打包&#xff08;jar包…

Ubuntu 20.04 LTS 安装 nvidia 驱动 + cuda 11.8 从开始到放弃!

升级 sources.list # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restri…

java的断言

断言介绍 Java的断言就是一条assert 声明&#xff0c;其中包含了一个布尔表达式。 断言可以被启用或者禁用&#xff0c;默认是禁用的。 断言被启用的情况下&#xff0c;执行到断言的声明&#xff0c;就会计算布尔表达式的值。如果表达式的值为false&#xff0c;那么就会抛出一…

9、架构:CLI 设计

通常大部分的程序员会更加习惯使用 CLI&#xff08;Command-Line Interface 命令行界面&#xff09;来辅助开发业务&#xff0c;包括初始化、更新、构建、发布等功能&#xff0c;可以获得沉浸式一站的开发体验。 在之前有一篇企业级 CLI 开发实战介绍过如何开发一款适用团队的…

阿里开业项目chat2DB-人工智能SQL分析介绍

1. chat2DB简介 1-1. 简介 ​ chat2DB是一款有开源免费的多数据库客户端工具&#xff0c;支持windows、mac本地安装&#xff0c;也支持服务器端部署&#xff0c;web网页访问。和传统的数据库客户端软件Navicat、DBeaver 相比Chat2DB集成了AIGC的能力&#xff0c;能够将自然语…

从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题

目录 1. 多态&#xff08;polymorphism&#xff09; 1.1 构成多态的两个条件 1.2 虚函数重写(覆盖) 1.3 协变构成多态 1.4 父虚子非虚构成多态 1.5 析构函数的重写 1.6 final 和 override 关键字&#xff08;C11&#xff09; 1.7 重载、覆盖、隐藏的对比 2. 抽象类&am…

11、架构:CI/CD 设计

本章内容是基于 DevOps 体系的精简版本&#xff0c;如果有阅读过之前 DevOps 小册的同学&#xff0c;可以快速掠过。 开局先放一张镇楼图&#xff0c;上图我在行云集团做的通用型 CI/CD 解决方案 ALL IN DOCKER&#xff0c;所有的操作构建与发布过程都在 Docker 中操作。 但很…

J2EE自定义mvc【框架配置及功能】

目录 一、配置步骤 二、配置框架前三步 导入相应的jar 导入相应的Class 导入xml文件 三、优化基本操作&#xff08;增删改&#xff09; 1、基础优化 编写实体类 编写BookDao类 优化BookDao JUnit测试 2、后台优化 3、前端优化 一、配置步骤 将框架打成jar包&…