RabbitMQ_消息的TTL与死信队列

news2024/11/16 15:29:40

什么是消息的TTL?

TTL = time to live,消息的TTL = 消息的存活时间过期时间

什么是死信队列?

当队列中的消息到达存活时间过期时间后,若未设置死信队列,则该消息将被抛弃,反之则转入死信队列

死信队列

配置类

死信队列仅需配置类,其与消息队列的绑定在消息队列的配置类中完成

// 死信队列
@Configuration
public class DeadLetterConfiguration {

    //订单交换机
    @Bean
    public DirectExchange deadLetterDirectExchange(){
        return new DirectExchange("dead_letter_direct_exchange_order", true, false);
    }

    //消息通知队列
    @Bean
    public Queue deadLetterQueue(){
        return new Queue("dead_letter_queue", true, false, false);
    }

    //绑定交换机与队列
    @Bean
    public Binding deadLetterDirectBinding(){
        return BindingBuilder.bind(deadLetterQueue()).to(deadLetterDirectExchange()).with("dead_letter_order");
    }
}

消息的TTL

消息的TTL分为消息队列的TTL消息本身的TTL

消息队列的TTL:被转发至该队列中的所有消息均遵循该队列的TTL规则

消息本身的TTL:消息遵循本身携带的TTL规则,不影响所处队列中的其他消息

问:若同时存在消息队列的TTL与消息本身的TTL,优先级如何?

答:取时间短者

消息队列的TTL

配置类

关于示例代码中的参数,可于RabbitMQ Management---Queue---Add a new queue---Arguments中查看

@Configuration
public class QueueTTLConfiguration {

    //订单交换机
    @Bean
    public DirectExchange queueTTLDirectExchange(){
        return new DirectExchange("ttl_direct_exchange_order", true, false);
    }

    //消息通知队列
    @Bean
    public Queue TTLQueue(){
        //TTL参数设置
        Map<String, Object> args = new HashMap<>();
        args.put("x-message-ttl", 5000);                                        //time to live 5000ms
        args.put("x-max-length", 5);                                            //队列最大消息数(溢出的消息移至死信队列)
        args.put("x-dead-letter-exchange", "dead_letter_direct_exchange_order");//死信队列交换机
        args.put("x-dead-letter-routing-key", "dead_letter_order");             //死信队列routingKey(当然 fanout交换机无需配置routingKey)
        return new Queue("ttl_queue", true, false, false, args);
    }

    //绑定交换机与队列
    @Bean
    public Binding TTLDirectBinding(){
        return BindingBuilder.bind(TTLQueue()).to(queueTTLDirectExchange()).with("queue_ttl");
    }
}

生产者

@Service
public class QueueTTLOrderService {
    @Autowired
    RabbitTemplate rabbitTemplate;

    public void makeOrder(String userID, String producerID, int num){
        // 1.根据需求查询仓库 判断是否能满足需求

        // 2.若能满足则生成订单
        String orderID = UUID.randomUUID().toString();
        System.out.println("成功生成订单");

        // 3.通过RabbitMQ发送消息
        String exchangeName = "ttl_direct_exchange_order";
        String routingKey = "queue_ttl";
        rabbitTemplate.convertAndSend(exchangeName, routingKey, orderID + " queue_ttl");
        System.out.println("订单发送成功");
    }
}

消费者

此处仅演示消息队列的TTL与死信队列,故不添加消费者

消息本身的TTL

配置类

此处演示不与死信队列绑定情况下的TTL

@Configuration
public class MessageTTLConfiguration {

    //订单交换机
    @Bean
    public DirectExchange messageTTLDirectExchange(){
        return new DirectExchange("ttl_direct_exchange_order", true, false);
    }

    //消息通知队列
    @Bean
    public Queue messageTTLQueue(){
        return new Queue("message_ttl_queue", true, false, false);
    }

    //绑定交换机与队列
    @Bean
    public Binding MessageTTLDirectBinding(){
        return BindingBuilder.bind(messageTTLQueue()).to(messageTTLDirectExchange()).with("message_ttl");
    }
}

生产者

@Service
public class MessageTTLOrderService {
    @Autowired
    RabbitTemplate rabbitTemplate;

    public void makeOrder(String userID, String producerID, int num){
        // 1.根据需求查询仓库 判断是否能满足需求

        // 2.若能满足则生成订单
        String orderID = UUID.randomUUID().toString();
        System.out.println("成功生成订单");

        // 3.通过RabbitMQ发送消息
        String exchangeName = "ttl_direct_exchange_order";
        String routingKey = "message_ttl";
        //消息传输加工机 此处用于为消息设置TTL时间
        MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setExpiration("5000");//Expiration 到期
                message.getMessageProperties().setContentEncoding("UTF-8");
                return message;
            }
        };
        // 将messagePostProcessor对象同消息一起传递
        rabbitTemplate.convertAndSend(exchangeName, routingKey, orderID + " message_ttl", messagePostProcessor);
        System.out.println("订单发送成功");
    }
}

消费者

此处仅演示消息本身的TTL,故不添加消费者

测试

消息队列的TTL:此处发送十条消息,溢出的五条会马上被送至死信队列,五秒后余下的五条也会被送至死信队列

    @Autowired
    QueueTTLOrderService queueTtlOrderService;
    @Test
    void ttlOrders(){
        for (int i = 0; i < 10; i++) {
            queueTtlOrderService.makeOrder("1", "1", 1);
        }
    }

消息本身的TTL:消息队列并未设置上限,也未绑定死信队列,故消息失效后将被直接抛弃

    @Autowired
    MessageTTLOrderService messageTTLOrderService;
    @Test
    void messageTTLOrder() {
        messageTTLOrderService.makeOrder("1", "1", 1);
    }

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

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

相关文章

Polygon zkEVM R1CS与Plonk电路转换

1. 引言 前序博客有&#xff1a; Polygon zkEVM的pil-stark Fibonacci状态机初体验Polygon zkEVM的pil-stark Fibonacci状态机代码解析rank-1 constraint system R1CS 由上图可知&#xff0c;zkEVM会借助SNARK来“验证&#xff08;&#xff08;验证STARK证明&#xff09;的SN…

博安生物再次冲刺港交所上市:负债规模高企,持续出现亏损

11月30日&#xff0c;山东博安生物技术股份有限公司&#xff08;下称“博安生物”&#xff09;再次向港交所递交招股书&#xff0c;准备在港交所主板上市。据贝多财经了解&#xff0c;博安生物曾于2022年5月13日递表&#xff0c;现已“失效”。 相较于此前招股书&#xff0c;博…

【图像分割】基于神经气体网络的图像分割与量化(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

了解抖音小程序的评级。为什么我的抖音小程序申请不了某个功能?

目录前言评级评级运营规范评级周期查看评级评级对应的权益小程序评级审核驳回场景信用分常见问题为什么我的小程序不能挂载短视频&#xff1f;前言 小程序评级体系是衡量小程序整体质量的参照&#xff0c;也是小程序获取对应权益的指南&#xff0c;旨在推动、鼓励开发者提升小…

matlab如何从信号中去除60 Hz Hum电源线噪声

美国和其他几个国家的交流电流以60赫兹的频率振荡。这些振荡经常会破坏测量值并且必须减去。 最近我们被客户要求撰写关于信号去噪数据的研究报告&#xff0c;包括一些图形和统计输出。 在存在60 Hz电源线噪声的情况下研究模拟仪器输入端的开环电压。电压以1 kHz采样。 lo…

C/C++内存管理(malloc/calloc/realloc/free/new/delete/operator new/operator delete)

目录 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free C内存管理方式:new/delete operator new与operator delete函数 new和delete的实现原理 malloc/free和new/delete的区别 (用法上和底层) 内存泄漏 C/C中程序内存区域划分&#xff1a; 1. 栈又叫堆栈…

Linux C简单服务器模型解析及完整代码

Linux C简单服务器模型解析及完整代码1.服务器端流程及解析2.服务器端代码3.客户端流程及解析4.客户端代码5.不足之处&#xff08;注&#xff1a;流程解析可结合相应代码处一起理解&#xff09;1.服务器端流程及解析 服务器端做的事情&#xff1a; 1.创建监听的套接字。 int s…

JAVA培训之数据库表关联关系

数据库表的关联关系有如下三种&#xff1a; 一对多 一对一 多对多 一对多的关系比较常见&#xff0c;我们在之前练习的都是一对多的关系操作&#xff0c;因此这里就不再重复介绍了。 1.一对一关系 在现实生活中&#xff0c;丈夫与妻子之间的关系就是一对一的关系&…

参数估计(1)-参数的点估计

为了考察总体X 的分布&#xff0c;我们将在2.4 节给出经验分布函数&#xff0c;并在总体X为连续型情形下绘制了频率直方图从中可大致看出总体的分布情况或分布形式&#xff0c;但总体分布中包含的参数往往不知&#xff0e;如何根据抽样对未知参数进行估计&#xff0c;就是本章讨…

pandas分组与聚合groupby()函数详解

一、groupby分组与聚合 分组与聚合通常是分析数据的一种方式&#xff0c;通常与一些统计函数一起使用&#xff0c;查看数据的分组情况 DataFrame.groupby(byNone, axis0, levelNone, as_indexTrue, sortTrue, group_keys_NoDefault.no_default, squeeze_NoDefault.no_default…

基于docker部署实现接口自动化持续集成

01 jenkins介绍及docker部署 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成 1、创建网络 2、下载并运行 docker:dind镜像…

思科路由器地址转换配置

思科路由器地址转换1.端口复用(PAT)2.配置PAT1.端口复用(PAT) 复用地址转换也称为端口地址转换&#xff08;Port Address Translation&#xff0c;PAT&#xff09;&#xff0c;首先是一种动态地址转换。路由器将通过记录地址、应用程序端口等唯一标识一个转换。通过这种转换&am…

Linux 负载均衡介绍

Linux 负载均衡介绍 LB LB&#xff1a;Load Balancing&#xff0c;负载均衡&#xff08;增加处理能力&#xff09;,有高可用能力&#xff0c;但不是高可用集群负载均衡集群&#xff0c;是以提高服务的并发处理能力为根本着眼点 负载均衡设备分类 1.软件负载均衡设备 (1)LVS&…

肝病患者关爱与病例管理

国内的肝病患者人数多达3亿人&#xff0c;并且还在逐年增多。 为慢性肝炎患者提供患者教育、病情自我管理、病友交流、医患交流等一系列的关怀行动&#xff0c;为医生提供病例数据管理系统平台推出了“肝病患者关爱与病例管理系统" 用户需求 平台覆盖用户群 中国肝病患者…

Thumbs.db文件取消自动生成及删除方法

一、背景 公司有一台centos服务器作为某个部门内部资料共享用,部署了samba服务。 每个用户具有自己的账户(账户不共用); 用户基本都是通过windows电脑访问samba共享文件; 最近有用户需要删除个别文件夹,发现不能删除Thumbs.db,导致文件夹也不能删除! 二、Thumbs.db是…

Java数据类型详细介绍

Java程序中要求参与的计算的数据&#xff0c;必须要保证数据类型的一致性&#xff0c;如果数据类型不一致将发生类型的转换。本文将通过示例详细说说Java中数据类型的转换&#xff0c;感兴趣的可以了解一下 1. Java数据类型 前面说到&#xff0c;程序运行时产生的临时数据我们…

继北极星项目后,又一款低成本AR眼镜开源方案:OpenAR

2018年的时候&#xff0c;Leap Motion&#xff08;Ultraleap前身&#xff09;曾开源了一款低成本、简易的AR头显方案&#xff1a;Project North Star&#xff08;北极星项目&#xff09;。该方案主要用来帮助爱好者、开发者们快速上手AR开发&#xff0c;而无需购买HoloLens等昂…

Python_文件操作

目录 一、文件编码 二、什么是文件 三、文件操作 1、打开文件 open()打开函数 2、读取文件 3、写入文件 f.write() 使用w模式 4、文件追加 类比文件写入&#xff0c;只是将‘w’-->‘a’ 5、文件操作综合案例 一、文件编码 Thinking: 计算机只能识别 0和1,那么文本文件 如何…

Delaunay三角网之逐点插入法(优化版本三)

文章目录 一、简介二、实现代码三、实现效果参考文献一、简介 继续对三角网的研究,这一个版本的三角网构网思路很是巧妙,虽然仍是基于点的插入算法,但已经有些分治算法的影子,构网速度相较于前面两个版本要快很多,12万个点可以在1s内完成构网。具体的构网过程如下所述: 1…

查询运行在顶部的app包名及类名

android的ActivityManager会在logcat中打印出当前正在显示的app的包名以及类名&#xff0c;注&#xff0c;这是由ActivityManager打印&#xff0c;使用的日志TAG就是ActivityManager&#xff0c;所以我们在过虑信息时不能以自己程序的进程进行过滤&#xff0c;使用ActivityMana…