RabbitMQ 过期时间(TTL)

TTL,Time to Live的简称,即过期时间,RabbitMQ可以对消息和队列设置TTL。

       RabbitMQ支持设置队列的过期时间和消息的过期时间。如果设置队列的过期时间则队列中所有的消息都有相同的过期时间。如果设置消息的过期时间则每条消息的过期时间则可以不同。如两个方法一起使用,则消息的TTL取最小的数值为重。消息在队列中的生存时间一旦超过了TTL值,则会变成死信,死信消息将被从原有队列中移除。

设置队列的过期时间

       针对队列设置过期时间RabbitMQ提供了三种设置方式:

  • 代码定义队列时设置x-message-ttl属性
  • 通过Policy方法设置
  • 通过调用HTTP API的方式设置(RabbitMQ管理工具)

       在大多数情况定义队列(代码定义)的过程中设置队列的过期时间就足够使用,方法2 3只要适用于不通过代码定义队列的场景,在这里不进行详细讲述。java实现中定义队列的方法如下

    /*** Declare a queue* @param queue the name of the queue   队列的名称* @param durable true if we are declaring a durable queue (the queue will survive a server restart) 是否持久化* @param exclusive true if we are declaring an exclusive queue (restricted to this connection) 是否独占队列(仅限于此连接)* @param autoDelete true if we are declaring an autodelete queue (server will delete it when no longer in use)  是否自动删除队列(服务器将在不再使用时删除它)* @param arguments other properties (construction arguments) for the queue  队列的其他属性(构造参数)* @return a declaration-confirm method to indicate the queue was successfully declared* @throws java.io.IOException if an error is encountered*/Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,Map<String, Object> arguments) throws IOException;

       从定义队列方法中不难看出,如果想要实现设置TTL参数,则需要从Map<String, Object> arguments入手。该参数为一个Map键值对。设置TTL的代码实现如下:

Map<String,Object> arguments = new HashMap<>();
arguments.put("x-message-ttl",6000);
channel.queueDeclare(queue,durable,exclusive,autoDelete,arguments);

       如果不给队列设置TTL,则按照消息的TTL进行处理,如果队列和消息都未设置TTL,则表明该消息不会过期,如果将TTL设置为0,则便是除非此时可以直接将消息投递给消费者,否则消息会被丢失。

设置消息的过期时间

       给消息设置过期时间及给每一条发送的消息分别设置过期时间,因此这个TTL在发送消息的时候继续设置。发送消息的方法如下:

    /*** Publish a message.* @param exchange the exchange to publish the message to 交换机名称* @param routingKey the routing key 路由键(交换机将消息存储到队列的依据)* @param mandatory true if the 'mandatory' flag is to be set 是否强制的(如果不存在存放消息的队列则将消息重新返回给生产者)* @param immediate true if the 'immediate' flag is to be* set. Note that the RabbitMQ server does not support this flag. (消息是否立即发送,RabbitMQ 3.0后弃用)* @param props other properties for the message - routing headers etc 消息的其他配置(路由标头等)* @param body the message body 消息内容* @throws java.io.IOException if an error is encountered*/void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body)throws IOException;

       从定义队列方法中不难看出,如果想要实现设置TTL参数,则需要从BasicProperties props入手。该类的具体参数如下:

        public static final class Builder {private String contentType;private String contentEncoding;private Map<String,Object> headers;// 是否持久化private Integer deliveryMode;private Integer priority;private String correlationId;private String replyTo;// 消息过期时间private String expiration;private String messageId;private Date timestamp;private String type;private String userId;private String appId;private String clusterId;

       根据上述内容,我们可以通过设置expiration的方法实现设置消息过期时间。

AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
builder.deliveryMode(2);
builder.expiration("2000");
AMQP.BasicProperties properties = builder.build();            channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY,properties,message.getBytes());

       需要注意的是RabbitMQ中的队列是一个先入先出的队列,而一个小时是否到达过期时间时当该消息即将被投放的时候进行判断,也就是说RabbiMQ没有必要轮询队列中所有的消息是否到底过期时间,仅需要判断即将发送的消息是否到达过期时间,如果到达过期时间则将该消息丢弃即可**。因此如果一个队列中的消息的过期时间各不相同,那么并不是一旦消息到达过期时间则从队列中丢失,只有该消息将被发送的时候才会被丢弃**。

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

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

相关文章

LeetCode 27题:移除元素

题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长…

攻防世界-reverse-logmein

题目描述&#xff1a;菜鸡开始接触一些基本的算法逆向了 下载附件&#xff0c;是一个可执行程序 1. 思路分析 逆向出来看看代码 从代码中来看&#xff0c;密码长度需要和V8相等&#xff0c;并且每一个字符的运算结果需要满足 s[i] (char)(v8[i % v6 - 8] ^ v8[i]) 但是这…

codeforces Split Into Two Sets

Polycarp was recently given a set of n (number n — even) dominoes. Each domino contains two integers from 11 to n. Can he divide all the dominoes into two sets so that all the numbers on the dominoes of each set are different? Each domino must go into e…

libtorch::Tensor与Eigen::Tensor互相转换

1. Eigen::Tensor转libtorch::Tensor Eigen::Tensor<float, 3> a{2,4,3};a.setRandom();a(1,2,1) 11.0;/*核心*/torch::Tensor b torch::from_blob(a.data(), {1, a.dimension(2), a.dimension(1), a.dimension(0)});/*核心*/b b.permute({0, 3, 2, 1});std::cout <…

vue2、vue3生命周期详解以及对比

文章目录 对比vue2-vue3vue3生命周期生命周期的主要阶段详情 vue2 生命周期生命周期钩子函数 总共11个 常用的8个按照这四个阶段我们对应有八个生命周期钩子函数vue生命周期使用场景 对比vue2-vue3 如果熟悉vue2的话&#xff0c;vue3信手拈来&#xff0c;看图 vue3生命周期 on…

impala使用md5(3条命令搞定)

文章目录 前言1、 找到当前使用的hive版本的hive-exec.jar文件2、上传到HDFS上。改权限3、impala加载function总结 前言 impala没有md5函数。 1、 找到当前使用的hive版本的hive-exec.jar文件 我们用的CDH&#xff0c;所以hive-exec.jar在每台服务器上都准备好的。 我装了loca…

AnimatedVectorDrawable矢量图动画的使用和修改

文章目录 一、前言二、一个矢量图文件三、参考链接 一、前言 矢量可绘制对象可以提供比较复杂的动画效果&#xff0c;只是绘制比较复杂&#xff0c;这里可以让UI使用Adobe After Effects软件制作出相关的矢量图xml文件交由开发使用。只是如果需要重复播放的动画效果时候&#…

解决多线程环境下单例模式同时访问生成多个实例

如何满足单例&#xff1a;1.构造方法是private、static方法、if语句判断 ①、单线程 Single类 //Single类&#xff0c;定义一个GetInstance操作&#xff0c;允许客户访问它的唯一实例。GetInstance是一个静态方法&#xff0c;主要负责创建自己的唯一实例 public class LazySi…

HCIP BGP选路规则总结

选路前提条件 多条BGP路由目标相同&#xff0c;且均可优(下一跳可达、同步关闭)&#xff0c;具有相同的优先级&#xff08;管理距离&#xff09;。 1、优选Preference_Value值最高的路由&#xff08;私有属性&#xff0c;仅本地有效&#xff09;。 不传递 权限最高属性 可…

【IDEA+Spark Streaming 3.4.1+Dstream监控套接字流统计WordCount保存至MySQL8】

【IDEASpark Streaming 3.4.1Dstream监控套接字流统计WordCount保存至MySQL8】 把DStream写入到MySQL数据库中 Spark 3.4.1MySQL 8.0.30sbt 1.9.2 文章目录 【IDEASpark Streaming 3.4.1Dstream监控套接字流统计WordCount保存至MySQL8】前言一、背景说明二、使用步骤1.引入库2…

【数字IC基础】低功耗设计

低功耗技术 功耗构成静态功耗(漏电功耗)动态功耗翻转功耗(Switch Power)短路功耗(Internal Power) 不同类型的标准单元的功耗 低功耗设计方法降低芯片工作电压多阈值工艺方法电源门控&#xff08;Power Gating&#xff09;多电压域(Multi-Voltage Domain)体偏置门控时钟一个简单…

微服务使用步骤

Maven的依赖冲突解决方案&#xff1a; 路径最短原则配置优先原则破坏规则则使用排除 SpringBoot场景启动器starter的开发流程 c3p0-spring-boot-starter自定义场景启动器test-c3p0调用自定义场景启动器SpringBoot自动装配SpringBoot应用启动原理nacos服务治理 安装 启动bin/s…

算法leetcode|66. 加一(rust重拳出击)

文章目录 66. 加一&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 66. 加一&#xff1a; 给定一个由 整数 组成的 非…

IDEA SpringBoot项目引入外部jar并打包

1、首先&#xff0c;我们再pom.xml中导入依赖包时&#xff0c;打包可以正常进行。 但如果我们引入了第三方的外部jar包&#xff08;这里需要先把jar包添加到该项目依赖库中&#xff0c;这里不做演示&#xff09;&#xff0c;如图 2、导致打包时报错&#xff0c;程序包不存在或…

1005 继续(3n+1)猜想

描述 卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里&#xff0c;情况稍微有些复杂。 当我们验证卡拉兹猜想的时候&#xff0c;为了避免重复计算&#xff0c;可以记录下递推过程中遇到的每一个数。例如对 n3 进行验证的时候&#xff0c;我们需要计算 3、5、8、4、…

SpringBoot 配置文件

一、配置文件作用 整个项目中所有重要的数据都是在配置文件中配置的&#xff0c;比如&#xff1a; 数据库的连接信息&#xff08;包含用户名和密码的设置&#xff09;&#xff1b; 项目的启动端口&#xff1b; 第三方系统的调用秘钥等信息&#xff1b; 用于发现和定位问题的…

MBG中update语句的区别

int updateByPrimaryKey(User record) thorws SQLException 按主键更新 int updateByPrimaryKeySelective(User record) thorws SQLException 按主键更新值不为null的字段 使用以上的方式更新数据时必须提供主键&#xff0c;MyBatis根据主键进行数据记录的更新。 int updateBy…

android app控制ros机器人四(调整界面布局)

半吊子改安卓&#xff0c;记录页面布局调整&#xff1a; 在ros-mobile基础上顶端增加一行&#xff0c;用于显示app名称和logo图像&#xff1b;修改标签页。 添加文字简单&#xff0c;但是替换图标长知识了&#xff0c;开始只是简单的把mipmap各个文件夹下的图片进行替换&…

MFC第二十六天 CRgn类简介与开发、封装CMemoryDC类并应用开发

文章目录 CRgn类简介与开发CRgn类简介CRgn类区域管理开发CRgn类区域管理与不规则形状的选取 封装CMemoryDC类并应用开发CMemoryDC.h封装CMemoryDC开发游戏透明动画CFlashDlg.hCFlashDlg.cpp 封装CMemoryDC开发游戏动画 附录四大窗口CDC派生类 CRgn类简介与开发 CRgn类简介 CR…

Qt 6. 其他类调用Ui中的控件

1. 把主类指针this传给其他类&#xff0c;tcpClientSocket new TcpClient(this); //ex2.cpp #include "ex2.h" #include "ui_ex2.h"Ex2::Ex2(QWidget *parent): QDialog(parent), ui(new Ui::Ex2) {ui->setupUi(this);tcpClientSocket new TcpClient…