【RabbitMQ高级——过期时间TTL+死信队列】

1. 过期时间TTL概述

过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取;过了之后消息将自动被删除。RabbitMQ可以对消息和队列设置TTL。

目前有两种方法可以设置。

  • 第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。
  • 第二种方法是对消息进行单独设置,每条消息TTL可以不同。

如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。消息在队列的生存时间一旦超过设置的TTL值,就称为dead message被投递到死信队列, 消费者将无法再收到该消息。

2.TTL设置方法

2.1. 通过队列属性设置

package com.zju.service.config;import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.HashMap;/*** @author guozonghao* @Description* @create 2024-10-04 09:37*/
@Configuration
public class TTLRabbitMqConfiguration {@Beanpublic DirectExchange ttlDirectExchange(){return new DirectExchange("ttl_direct_exchange",true,false);}@Beanpublic Queue directTTLQueue(){//设置过期时间HashMap<String, Object> args = new HashMap<>();args.put("x-message-ttl",5000);//这里一定是int类型return new Queue("ttl.direct.queue",true,false,false,args);}@Beanpublic Binding directTTLBinding(){return BindingBuilder.bind(directTTLQueue()).to(ttlDirectExchange()).with("ttl");}
}

2.2. 通过消息属性设置

通过AMQP.BasicProperties这个类在发送消息时配置相关的属性

public class MessageTTLProducer {public static void main(String[] args) {// 1: 创建连接工厂ConnectionFactory connectionFactory = new ConnectionFactory();// 2: 设置连接属性connectionFactory.setHost("47.104.141.27");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");connectionFactory.setUsername("admin");connectionFactory.setPassword("admin");Connection connection = null;Channel channel = null;try {// 3: 从连接工厂中获取连接connection = connectionFactory.newConnection("生产者");// 4: 从连接中获取通道channelchannel = connection.createChannel();// 5: 申明队列queue存储消息/**  如果队列不存在,则会创建*  Rabbitmq不允许创建两个相同的队列名称,否则会报错。**  @params1: queue 队列的名称*  @params2: durable 队列是否持久化*  @params3: exclusive 是否排他,即是否私有的,如果为true,会对当前队列加锁,其他的通道不能访问,并且连接自动关闭*  @params4: autoDelete 是否自动删除,当最后一个消费者断开连接之后是否自动删除消息。*  @params5: arguments 可以设置队列附加参数,设置队列的有效期,消息的最大长度,队列的消息生命周期等等。* */channel.queueDeclare("ttl.queue2", true, false, false, null);// 6: 准备发送消息的内容String message = "你好,学相伴!!!";Map<String, Object> headers = new HashMap<String, Object>();headers.put("x", "1");headers.put("y", "1");AMQP.BasicProperties basicProperties = new AMQP.BasicProperties().builder().deliveryMode(2) // 传送方式.priority(1).contentEncoding("UTF-8") // 编码方式.expiration("5000") // 过期时间.headers(headers).build(); //自定义属性// 7: 发送消息给中间件rabbitmq-server// @params1: 交换机exchange// @params2: 队列名称/routing// @params3: 属性配置// @params4: 发送消息的内容for (int i = 0; i <10 ; i++) {channel.basicPublish("", "ttl.queue2", basicProperties, message.getBytes());System.out.println("消息发送成功!");}} catch (Exception ex) {ex.printStackTrace();System.out.println("发送消息出现异常...");} finally {// 7: 释放连接关闭通道if (channel != null && channel.isOpen()) {try {channel.close();} catch (Exception ex) {ex.printStackTrace();}}if (connection != null && connection.isOpen()) {try {connection.close();} catch (Exception ex) {ex.printStackTrace();}}}}
}

3. 死信队列

DLX,全称为Dead-Letter-Exchange , 可以称之为死信交换机,也有人称之为死信邮箱。当消息在一个队列中变成死信(dead message)之后,它能被重新发送到另一个交换机中,这个交换机就是DLX ,绑定DLX的队列就称之为死信队列。
消息变成死信,可能是由于以下的原因:

  • 消息被拒绝(没有被ack)
  • 消息过期
  • 队列达到最大长度

DLX也是一个正常的交换机,和一般的交换机没有区别,它能在任何的队列上被指定,实际上就是设置某一个队列的属性。当这个队列中存在死信时,Rabbitmq就会自动地将这个消息重新发布到设置的DLX上去,进而被路由到另一个队列,即死信队列。
要想使用死信队列,只需要在定义队列的时候设置队列参数 x-dead-letter-exchange 指定交换机即可。
在这里插入图片描述

3.1 创建死信队列

package com.zju.service.config;import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.HashMap;/*** @author guozonghao* @Description* @create 2024-10-04 09:37*/
@Configuration
public class DeadRabbitMqConfiguration {@Beanpublic DirectExchange deadDirectExchange(){return new DirectExchange("dead_direct_exchange",true,false);}@Beanpublic Queue directDeadQueue(){return new Queue("dead.direct.queue",true);}@Beanpublic Binding directDeadBinding(){return BindingBuilder.bind(directDeadQueue()).to(deadDirectExchange()).with("dead");}
}

3.2 其他队列绑定死信队列

package com.zju.service.config;import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.HashMap;/*** @author guozonghao* @Description* @create 2024-10-04 09:37*/
@Configuration
public class TTLRabbitMqConfiguration {@Beanpublic DirectExchange ttlDirectExchange(){return new DirectExchange("ttl_direct_exchange",true,false);}@Beanpublic Queue directTTLQueue(){//设置过期时间HashMap<String, Object> args = new HashMap<>();args.put("x-message-ttl",5000);//设置过期时间args.put("x-max-length",5);//设置队列的最大长度args.put("x-dead-letter-exchange","dead_direct_exchange");//绑定自己创建的死信交换机args.put("x-dead-letter-routing-key","dead");//设置死信队列的路由keyreturn new Queue("ttl.direct.queue",true,false,false,args);}@Beanpublic Binding directTTLBinding(){return BindingBuilder.bind(directTTLQueue()).to(ttlDirectExchange()).with("ttl");}
}

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

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

相关文章

基于Springboot的宠物咖啡馆平台的设计与实现(源码+定制+参考)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

【操作系统】四、文件管理:1.文件系统基础(文件属性、文件逻辑结构、文件物理结构、文件存储管理、文件目录、基本操作、文件共享、文件保护)

文件管理 文章目录 文件管理八、文件系统基础1.文件的属性2.文件的逻辑结构2.1顺序文件2.2索引文件2.3索引顺序文件2.4多级索引顺序文件 3.目录文件❗3.1文件控制块FCB3.1.1对目录进行的操作 3.2目录结构3.2.1单级目录结构3.2.2两级目录结构3.2.3多级目录结构&#xff08;树形目…

【大模型部署】本地运行自己的大模型--ollama

ollama简介 ollama是一款开源的、轻量级的框架&#xff0c;它可以快速在本地构建及运行大模型&#xff0c;尤其是一些目前最新开源的模型&#xff0c;如 Llama 3, Mistral, Gemma等。 官网上有大量已经开源的模型&#xff0c;部分针对性微调过的模型也可以选择到&#xff0c;…

Qt源码-Qt多媒体音频框架

Qt 多媒体音频框架 一、概述二、音频设计1. ALSA 基础2. Qt 音频类1. 接口实现2. alsa 插件实现 一、概述 环境详细Qt版本Qt 5.15操作系统Deepin v23代码工具Visual Code源码https://github.com/qt/qtmultimedia/tree/5.15 这里记录一下在Linux下Qt 的 Qt Multimedia 模块的设…

Javascript笔试题目(一)

1.JS查找文章中出现频率最高的单词? 要在JavaScript中查找文章中出现频率最高的单词&#xff0c;你可以按照以下步骤进行操作&#xff1a; 将文章转换为小写&#xff1a;这可以确保单词的比较是大小写不敏感的。移除标点符号&#xff1a;标点符号会干扰单词的计数。将文章拆…

基于Web的停车场管理系统(论文+源码)_kaic

摘要 我国经济的发展愈发迅速&#xff0c;车辆也随之增加的难以想象&#xff0c;因此车位的治理也越来越繁杂&#xff0c;为了方便停车位相关信息的管理&#xff0c;设计开发一个合理的停车位管理系统尤为重要。因而&#xff0c;具有信息方便读取和操作简便的停车位管理系统的设…

在启智AI平台实践ChatGLM4-9B聊天机器人@MindSpore

前段时间在昇思训练营发现一个好东西&#xff0c;就是昇思AI实验室&#xff1a;昇思大模型平台 在官方提供的jupyter AI编程实践样例中&#xff0c;发现了这个项目&#xff1a;ChatGLM4-9B实践样例 GLM-4-9B是智谱 AI 推出的最新一代预训练模型 GLM-4 系列中的开源版本。 在语…

两个数相加(c语言)

1./给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target // 的那 两个 整数&#xff0c;并返回它们的数组下标。 //你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。你可以按任意顺序返回答案。 /…

Windows电脑本地安装AI文生音乐软件结合内网穿透远程访问制作

文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 今天和大家分享一下在Windows系统电脑上本地快速部署一个文字生成音乐的AI创作服务MusicGPT&#xff0c;并结合cpolar内网穿透工具实现随时随地远程访问使用进行AI音…

TextView把其它控件挤出屏幕的处理办法

1.如果TextView后面的控件是紧挨着TextView的&#xff0c;可以给TextView添加maxWidth限制其最大长度 上有问题的布局代码 <?xml version"1.0" encoding"utf-8"?> <layout xmlns:android"http://schemas.android.com/apk/res/android&qu…

【D3.js in Action 3 精译_030】3.5 给 D3 条形图加注图表标签(下):Krisztina Szűcs 人物专访 + 3.6 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

《大规模语言模型从理论到实践》第一轮学习笔记

第一章 绪论 本章主要介绍大规模语言模型基本概念、发展历程和构建流程。 大规模语言模型&#xff08;Large Language Models&#xff0c;LLM&#xff09;&#xff0c;也称大语言模型 或大型语言模型。 1.1 大规模语言模型基本概念 1.语言模型&#xff08;Language Model&a…

Python脚本分类和代码举例

Python是一种强大且灵活的编程语言&#xff0c;被广泛应用于数据分析、Web开发、自动化、人工智能等领域。在不同的应用场景下&#xff0c;Python脚本可以被分类为多种类型。本文将深入分析Python脚本的分类&#xff0c;同时提供相关代码示例&#xff0c;帮助读者理解和应用这些…

【CF2021E】Digital Village(All Version)

题目 给你一张 n n n 个点 m m m 条边的无向图&#xff0c;有 p p p 个关键点。你需要选择 k k k 个点染黑&#xff0c;使得这 p p p 个关键点到这 k k k 个黑点的代价和最小。定义代价为两点之间边权最大的边的最小值。 你需要求出 k 1,2,…,n 的所有答案 E1 n,m,p&l…

Mapsui绘制WKT的示例

步骤 创建.NET Framework4.8的WPF应用在NuGet中安装Mapsui.Wpf 4.1.7添加命名空间和组件 <Window x:Class"TestMapsui.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winf…

Python物联网编程:10个IoT设备通信的脚本

今天我们要聊的是如何使用Python编写脚本来实现10个IoT设备之间的通信。物联网&#xff08;IoT&#xff09;是一个充满无限可能的领域&#xff0c;它将日常设备连接到互联网&#xff0c;使它们能够互相通信、收集数据并做出响应。Python以其简洁易懂的语法和强大的库支持&#…

浅谈 WMS 的应用行业_SunWMS智慧仓储物流系统

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。一站式数智工厂解决方案服务商】 仓库管理系统&#xff08;WMS&#xff09;已经成为众多行业优化运营、提高效率和竞争力的重要工具。WMS 的应用范围广泛&#xff0c;涵盖了制造业、零售业、电商、…

调用第三方接口

目录 一、分析给出的接口文档 二、请求体格式之间的区别 三、示例代码 一、分析给出的接口文档 一般的接口文档包括以下几大部分&#xff1a; 1、请求URL&#xff1a;http://{ip}:{port}/api/ec/dev/message/sendCustomMessageSingle 2、请求方式&#xff1a;POST、GET等 3、…

基于SpringBoot+Vue的超市管理系统设计实现(协同过滤算法、图形化分析)

&#x1f388;系统亮点&#xff1a;协同过滤算法、图形化分析&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框…

主数据驱动的数据治理高清书籍领取

主数据驱动的数据治理 原理、技术与实践 高清版本电子书领取 绝对高清版本的电子书&#xff0c;抓紧来获取吧&#xff5e;&#xff5e;&#xff5e;