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);}//将队列和交换机进行绑定@Beanpublic 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. 对每一条消息单独设置过期时间

    @Beanpublic DirectExchange ttlMessageExchange(){return new DirectExchange("ttl_message_exchange",true,false);}@Beanpublic Queue ttlMessage(){return new Queue("ttl_message",true,false,false,null);}@Beanpublic 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");//设置存活时间 msMessage 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));}

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

若依@DataScope

DataScope &#xff1a; 根据sys_role 中的 data_scope中的值&#xff0c;来设置数据该怎么过滤&#xff0c;&#xff0c; data_scope 取值&#xff1a; 1 &#xff1a; 不需要过滤2 &#xff1a; 自定义过滤 &#xff1a; 根据 sys_role_dept 这个表关联出来的 dept_id 过滤…

函数指针数组的概念和应用

函数指针数组 是什么&#xff1f; 函数指数组是存放函数指针的数组 int Add(int x, int y) {return x y; }int Sub(int x, int y) {return x - y; }int Mul(int x, int y) {return x * y; }int Div(int x, int y) {return x / y; }int main() {int(*parr[4])(int, int) { …

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…

回归预测 | MATLAB实现WOA-DNN鲸鱼算法优化深度神经网络的数据多输入单输出回归预测

回归预测 | MATLAB实现WOA-DNN鲸鱼算法优化深度神经网络的数据多输入单输出回归预测 目录 回归预测 | MATLAB实现WOA-DNN鲸鱼算法优化深度神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 回归预测 | MATLAB实现WOA-DNN鲸鱼算法优化深度…

什么是Qt Widgets?一组创建经典桌面应用UI的界面组件!

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 Qt Widgets模块提供…

spring-依赖注入的方式

setter注入-可选依赖注入 简单类型&#xff1a; 1.配置类 2.set方法 引用类型&#xff1a; 构造器注入-强制依赖注入 简单类型&#xff1a; 引用类型&#xff1a; 通过有参构造&#xff0c;获得需要注入的对象 <construct-arg />标签中name属性中填写的时构造方…

Linux--进程

什么叫做进程&#xff1f; 程序加载到内存就叫进程&#xff08;看不懂是吧&#xff0c;看下面更详细一些&#xff09; 进程对应的代码和数据进程对应的PCB结构体

Stable Diffusion系列课程上:安装、提示词入门、常用模型(checkpoint、embedding、LORA)、放大算法、局部重绘、常用插件

文章目录 一、Stable Diffusion简介与安装二、文生图&#xff08;提示词解析&#xff09;2.1 提示词入门2.2 权重2.3 负面提示词&#xff08; Negative prompt&#xff09;2.4 出图参数设置2.5 新手念咒方法 三、图生图3.1 图生图入门3.2 随机种子解析3.3 图生图拓展 四、模型4…

【C++进阶】bitset位图介绍以及模拟实现

文章目录 位图介绍一、位图的引入二、位图的概念 位图模拟实现一、构造函数二、set&#xff0c;reset&#xff0c;test函数三、代码测试四、完整代码 位图介绍 一、位图的引入 先来看下边一道面试题&#xff1a; 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符…

基于SpringBoot+Vue的影城管理系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Docker - 基本概念、与虚拟机的区别、架构、镜像操作、容器操作、数据卷挂载

目录 一、对 Docker 的理解 1、Docker 基本概念 2、Docker 与 虚拟机的区别 3、何为镜像和容器&#xff1f; 4、Docker 主要架构 二、Docker 基本操作 1、Docker 镜像操作 2、案例&#xff08;镜像&#xff09;&#xff1a;去 DockerHub 搜索并拉取一个 Nginx 镜像&am…

Python数据分析常见Matplotlib SeaBorn图表

Matplotlib绘图 Matplotlib基本概念 Matplotlib&#xff1a;基于对象的思维构建的视觉符号。 每一个Axes&#xff08;坐标轴&#xff09;对象包含一个或者多个Axis(轴)对象&#xff0c;比如X轴、Y轴。 一个Figure&#xff08;画像&#xff09;是由一堆坐标轴对象组成的。 换…