RabbitMQ实践——超时消息的处理方法

大纲

  • 准备工作
  • 整个队列的消息都有相同的时效性
    • 抛弃超时消息
      • 新建带x-message-ttl的队列
      • 新建绑定关系
      • 实验
    • 超时消息路由到死信队列
      • 新建带死信和ttl的队列
      • 新建绑定关系
      • 实验
  • 消息指定自己的超时时间
    • 新建带死信的队列
    • 绑定
    • 实验
  • 消息自带TTL和队列TTL的关系
    • 消息TTL < 队列指定TTL
    • 消息TTL > 队列指定TTL
    • 总结
  • 代码工程

在项目中,我们往往会遇到消息具有时效性:在一定时间内的消息需要处理,其他消息则不用处理。RabbitMQ提供了两种功能来满足这种需求:

  • 整个队列的消息都有相同的时效性。
  • 消息可以指定自己的超时时间。

对于超时的消息,我们可以选择抛弃,或者让其进入死信。本文我们将实验这些场景。

准备工作

我们先新建一个交换器direct.ttl。后续不同场景我们再设定其不同路由。
在这里插入图片描述
然后再创建一个死信队列queue.dead.letter
在这里插入图片描述
最后新建交换器direct.ttl和队列queue.dead.letter的路由绑定关系
在这里插入图片描述

后续我们将根据不同场景新建不同的队列和绑定关系。

整个队列的消息都有相同的时效性

抛弃超时消息

新建带x-message-ttl的队列

如果队列设置了x-message-ttl,则其全部消息的最大ttl就是其值。它的单位是毫秒。下图中,队列消息如果30秒没有处理,就会从队列中移除。
在这里插入图片描述

新建绑定关系

我们让交换器中Routing key是to.queue.all.message.ttl的消息路由到上面创建的队列中。
在这里插入图片描述

实验

向该交换器发送一条消息
在这里插入图片描述
消息出现在队列queue.all.message.ttl中。
在这里插入图片描述
半分钟后,该条消息从队列中消失。
在这里插入图片描述

超时消息路由到死信队列

不同于上例,只是设置了x-message-ttl,还要设置死信相关参数。本例我们将使用“重写Routing key”的方案,节省一次交换器的创建。

新建带死信和ttl的队列

新建名字是queue.all.msg.ttl.dead.letter的队列。这个队列中的所有消息的最大超时时间(x-message-ttl)是30秒;超时消息会被修改Routing key为to.queue.dead.letter后,使用direct.ttl交换器来路由。
在这里插入图片描述

新建绑定关系

将这个队列和之前新建的交换器direct.ttl关联。
在这里插入图片描述

实验

在这里插入图片描述
在这里插入图片描述
可以看到消息在过了30秒后,被从原来的队列queue.all.msg.ttl.dead.letter中移除,然后路由到死信队列queue.dead.letter中。
在这里插入图片描述

消息指定自己的超时时间

本例我们只实验相对复杂的场景,即将超时消息路由到死信。

新建带死信的队列

这个队列我们没有设置ttl相关数据,只是设置了死信相关配置:死信消息交由交换器direct.ttl处理,其Routing key被修改成to.queue.dead.letter。
在这里插入图片描述

绑定

在这里插入图片描述

实验

这次我们不能使用后台来发送消息,而是通过Java代码来发送。

public void sendWithTTL(String exchangeName, String routingKey, String message, int ttl) {
    String msgId = UUID.randomUUID().toString();
    Message msg = MessageBuilder.withBody(message.getBytes())
            .setContentType("text/plain")
            .setCorrelationId(msgId)
            .setMessageId(msgId)
            .setExpiration(String.valueOf(ttl))
            .build();

    CorrelationData correlationData = new CorrelationData(msgId);
    rabbitTemplateWithoutMandatory.convertAndSend(exchangeName, routingKey, msg, correlationData);
}

发送消息时我们只需要给消息增加setExpiration调用即可。它的单位是毫秒,需要转换为字符串。
在这里插入图片描述
在这里插入图片描述
可以看到20秒后,消息从queue.with.dead.letter队列进入queue.dead.letter队列。
在这里插入图片描述
在这里插入图片描述

消息自带TTL和队列TTL的关系

如果一个自带TTL的消息被路由到一个所有消息都被队列指定TTL的队列上,那么哪个TTL生效呢?
我们用第二个案例的接口,给第一个案例的队列发送一个自带TTL的消息。

消息TTL < 队列指定TTL

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
可以看到消息在20秒时就进入了死信。

消息TTL > 队列指定TTL

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到消息在30秒时就进入了死信。

总结

如果队列指定TTL,消息也设置了TTL,取最接近当前时间的TTL。即用最短的那一个。

代码工程

https://github.com/f304646673/RabbitMQDemo

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

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

相关文章

使用 Ubuntu x86_64 平台交叉编译适用于 Linux aarch64(arm64) 平台的 QT5(包含OpenGL/WebEngine支持) 库

使用 Ubuntu AMD64 平台交叉编译适用于 Linux ARM64 平台的 QT5(包含 OpenGL/WebEngine 支持) 库 目录 使用 Ubuntu AMD64 平台交叉编译适用于 Linux ARM64 平台的 QT5(包含 OpenGL/WebEngine 支持) 库写在前面前期准备编译全流程1. 环境搭建2. 复制源码包并解压&#xff0c;创…

django 和 pyecharts实现可视化大屏(完整代码)

1.配置settings文件 &#xff08;1&#xff09;注意&#xff1a;需要先创建app(djnago-admin startapp app名称) &#xff08;2&#xff09;配置模板文件 DIRS: [os.path.join(BASE_DIR, templates)], &#xff08;3&#xff09;配置静态文件(这里我由于存放清洗好的需要进行可…

数据结构与算法笔记:高级篇 - 位图:如何实现网页爬虫中的URL去重功能?

概述 网页爬虫是搜索引擎中的非常重要的系统&#xff0c;复杂爬取几十亿、上百亿额度网页。爬虫的工作原理是&#xff0c;通过解析已经爬取网页中的网页链接&#xff0c;然后再爬取这些链接对应地网页。而同一个网页链接有可能被包含在多个页面中&#xff0c;这就会导致爬虫在…

测试开发是什么?为什么现在那么多公司都要招聘测试开发?

测试开发是一种软件开发过程中的一种角色&#xff0c;旨在提高软件质量并确保软件功能完善和稳定。测试开发人员负责编写和执行自动化测试脚本&#xff0c;创建测试工具和框架&#xff0c;以及与开发人员紧密合作&#xff0c;提供实时反馈和改进。 为什么现在那么多公司都要招…

RISC-V异常处理流程概述

RISC-V异常处理流程概述 一、RISC-V异常处理流程和异常委托1.1 异常处理流程1.2 异常委托二、RISC-V异常处理中软件相关内容2.1 异常处理准备工作2.2 异常处理函数2.3 Opensbi系统调用的注册三、参考资料一、RISC-V异常处理流程和异常委托 1.1 异常处理流程 发生异常时,首先…

聚乙烯醇(PVA)涂布型薄膜是高阻隔性包装材料 我国市场增长快速

聚乙烯醇&#xff08;PVA&#xff09;涂布型薄膜是高阻隔性包装材料 我国市场增长快速 聚乙烯醇&#xff08;PVA&#xff09;涂布型薄膜&#xff0c;是以其他塑料薄膜&#xff08;主要是双向拉伸薄膜&#xff09;为基材&#xff0c;以聚乙烯醇为涂料&#xff0c;经表面涂布后制…

如何从0构建一款类jest工具

Jest工作原理 Jest 是一个流行的 JavaScript 测试框架&#xff0c;特别适用于 React 项目&#xff0c;但它也可以用来测试任何 JavaScript 代码。Jest 能够执行用 JavaScript 编写的测试文件的原因在于其设计和内部工作原理。下面是 Jest 的工作原理及其内部机制的详细解释&…

C语言的学习发展路线(都是干货)

哈喽&#xff0c;大家好呀~我又回来了&#xff0c;前期比较忙&#xff0c;没有时间来更文&#xff0c;现在给大家推荐了一个C语言的学习路线&#xff0c;供大家一起学习啦&#xff01; 1. 环境搭建与工具篇 选择编译器&#xff1a;常用的编译器有gcc、Clang、Visual Studio等。…

第一个Java程序--HalloWorld(记事本版)

一、开发步骤 1.编写 将 Java 代码编写到扩展名为 .java 的源文件中 class HelloChina{public static void main(String[] args){System.out.println("HelloWorld!");} } 2.编译 winr进入DOS操作系统&#xff0c;进入当前目录。&#xff08;操作命令见《JAVA概述…

红酒哲学:品味流转时光,探寻生活之深邃奥秘

在繁华的都市中&#xff0c;我们时常被各种声音和色彩所包围&#xff0c;追求着速度与激情。然而&#xff0c;在这喧嚣之中&#xff0c;总有那么一刻&#xff0c;我们渴望静下心来&#xff0c;品味一份不同的宁静与深度。这时&#xff0c;一杯雷盛红酒便成了我们与内心对话的桥…

Ubuntu磁盘分区和挂载 虚拟机扩容 逻辑卷的创建和扩容保姆及教程

目录 1、VMware虚拟机Ubuntu20.04系统磁盘扩容 2、Linux的磁盘分区和挂载 3、创建逻辑卷和逻辑卷的扩容 1、VMware虚拟机Ubuntu20.04系统磁盘扩容 通过下图可以看出我们的根磁盘一共有20G的大小&#xff0c;现在我们把它扩容为30G 注&#xff1a;如果你的虚拟机有快照是无…

鸿萌数据迁移业务案例:为医药客户成功迁移重要科研数据

天津鸿萌科贸发展有限公司对 Windows 及 Linux 系统下的各类型备份及数据迁移业务积累了丰富的业务经验&#xff0c;可提供针对性的解决方案。 医药科研数据迁移成功案例 2024年6月初&#xff0c;天津某医药厂家埃尔法 workstation2020 服务器硬盘老化&#xff0c;为保证服务…

小白上手AIGC-基于PAI-DSW部署Stable Diffusion文生图Lora模型

小白上手AIGC-基于PAI-DSW部署Stable Diffusion文生图Lora模型 前言资源准备开启体验服务创建工作空间 部署服务创建DSW实例安装Diffusers启动WebUI 写在最后 前言 在上一篇博文小白上手AIGC-基于FC部署stable-diffusion 中&#xff0c;说到基于函数计算应用模板部署AIGC文生图…

这么精彩的排序算法,你确定不来看一下?

目录 1.交换函数&#xff1a; 2.三数取中&#xff1a; 一.插入排序&#xff1a; 二.希尔排序&#xff1a; 三.选择排序&#xff1a; 四.快速排序&#xff1a; 1.霍尔法&#xff08;递归版&#xff09;&#xff1a; 2.挖坑法&#xff08;递归版&#xff09;&#xff1a; 3.双指针…

智领全栈,模力全开|2024中国智算中心全栈技术大会,锐捷网络引爆智算网络新风潮

6月25日至27日&#xff0c;2024中国智算中心全栈技术大会暨展览会、第5届中国数据中心绿色能源大会暨第10届中国(上海)国际数据中心产业展览会在上海新国际博览中心隆重开幕。此次大会由CDCC和益企研究院主办&#xff0c;以“AI赋能&#xff0c;重构未来”为主题&#xff0c;吸…

重温react-06

开始 函数组件必然成为未来发展的趋势(个人见解),总之努力的去学习,才能赚更多的钱.加油呀! 函数组件的格式 import React from reactexport default function LearnFunction01() {return (<div>LearnFunction01</div>) }以上是函数式组件的组基本的方式 快捷生…

如何提高工业交换机的电源功耗?

工业交换机的电源功耗是指在工作状态下所消耗的能量。随着工业自动化技术的发展&#xff0c;工业交换机在生产和制造领域中扮演着至关重要的角色。它们通过连接各种设备和系统&#xff0c;实现信息的传输和处理&#xff0c;提高生产效率和质量。然而&#xff0c;工业交换机的大…

springAI孵化(二)

目录 一、spring AI 目的 二、spring AI 来源 三、sprig AI 是什么&#xff1f; 四、spring AI中的 概念 4.1、模型&#xff08;Models&#xff09; 4.2、提示&#xff08;Prompts&#xff09; 4.3、提示模板&#xff08;Prompt Templates&#xff09; 4.4、令 牌&…

你的企业“赚钱能力”,银行怎么看?聊聊税贷与票贷背后的门道

大家都听过“税贷”和“票贷”吧&#xff1f;特别是这两年&#xff0c;国家扶持中小微企业&#xff0c;这些名词更是火得不行。但你知道吗&#xff0c;税贷和票贷并不是只看税和票那么简单。今天&#xff0c;咱就来聊聊这背后的门道&#xff08;最后附上&#xff1a;企业信用贷…

ChatGPT的Mac客户端正式发布了!Mac用户有福了

ChatGPT的Mac客户端正式发布了&#xff01;Mac用户有福了 &#x1f389; 大家好&#xff0c;我是猫头虎&#xff0c;科技自媒体博主。今天我带来了一个超级重磅的消息 &#x1f4e2;&#xff0c;就是 ChatGPT 的客户端终于来了&#xff01;这对我们所有 Mac 用户&#xff0c;尤…