第十五章 RabbitMQ延迟消息之延迟插件

目录

一、引言

二、延迟插件安装

2.1. 下载插件

2.2. 安装插件 

2.3. 确认插件是否生效

三、核心代码

 四、运行效果

五、总结 


一、引言

上一章我们讲到通过死信队列组合消息过期时间来实现延迟消息,但相对而言这并不是比较好的方式。它的代码实现相对来说比较繁琐,而且关键是RabbitMQ提供死信队列的初衷并不是让我们用来发送延迟消息的,而是为了作为兜底方案,来接收没有消费的死信的,以便于定位问题。那么本章节我们就开始讲解通过延迟消息插件来实现延迟消息。

延迟消息插件可以将普通交换机改造为支持延迟消息功能的交换机,当消息投递到交换机后可以暂存一定时间,到期后再投递到队列。

这个插件可以将普通交换机改造为支持延迟消息功能的交换机,当消息投递到交换机后可以暂存一定时间,到期后再投递到队列。

发送消息时需要通过消息头x-delay来设置过期时间:

二、延迟插件安装

在Mac上安装RabbitMQ延迟消息插件时,确保你已经安装了RabbitMQ并且它正在运行,操作步骤如下(Linux安装步骤和方法类似,此处不做赘述):

2.1. 下载插件

从RabbitMQ官方GitHub仓库或者通过以下命令直接下载,我这里是最新版本:

wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/v4.0.2/rabbitmq_delayed_message_exchange-4.0.2.ez

2.2. 安装插件 

将下载的插件拷贝到RabbitMQ的plugins目录,使用RabbitMQ插件管理命令安装下载的插件:

sudo rabbitmq-plugins enable rabbitmq_delayed_message_exchange

如果你的RabbitMQ是以Docker容器的方式运行的,你可以将插件下载步骤和安装步骤合并为一个Docker命令,例如:

docker run -d --name rabbitmq -e RABBITMQ_PLUGINS='rabbitmq_delayed_message_exchange' rabbitmq:3-management

这个命令会启动一个带有RabbitMQ管理插件的容器,并且会自动安装延迟消息插件。

2.3. 确认插件是否生效

安装成功后,RabbitMQ的浏览器界面上,exchange交换机在创建时,Type多了x-delayed-message选项。

请注意,具体的RabbitMQ版本和插件版本可能会更新,因此请根据实际情况下载相应的版本。 

三、核心代码

package com.example.publisher;import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.test.context.SpringBootTest;import java.nio.charset.StandardCharsets;/*** 生产者*/
@Slf4j
@SpringBootTest
class PublisherApplicationTests {@Resourceprivate RabbitTemplate rabbitTemplate;@Testvoid test() {String content = "生活不易,所以保持足够的努力,对自己要有信心,积极地去面对工作生活的挑战!";Message message = MessageBuilder.withBody(content.getBytes(StandardCharsets.UTF_8)).build();message.getMessageProperties().setDelayLong(10000L);rabbitTemplate.convertAndSend("delay.direct","delay", message);}
}
package com.example.consumer;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;import java.nio.charset.StandardCharsets;/*** 消费者*/
@Slf4j
@Component
public class SimpleListener {@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "delay.queue", durable = "true"),exchange = @Exchange(name = "delay.direct", delayed = "true"),key = "delay"))public void listener1(Message message) throws Exception {String msg = new String(message.getBody(), StandardCharsets.UTF_8); ;System.out.println("延迟消息:人生是个不断攀登的过程【" + msg + "】");}
}

 四、运行效果

我们可以看到消息在延时10秒后消费

 

五、总结 

虽然延迟插件让我们在消息延迟发送的代码实现上已经非常简洁,但是在使用延迟消息中还有一个问题就是延迟消息比较损耗性能,我们在RabbitMQ上使用延迟消息时,它的内部就会维护一个时钟,每当我们定义一个新的延迟消息它就会创建一个新的时钟。如果一个任务的延迟时间特别长,比如一小时甚至一天,将非常耗性能。所以延迟消息比较适用于延迟的时间比较短的场景,比如10分钟未支付取消订单。

但是我们如果直接设定10分钟后发送延迟消息,也不是最优解,我们将在下一章,对延迟消息做近一步的优化!

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

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

相关文章

嵌入式开发:STM32 硬件 CRC 使用

测试平台:STM32G474系列 STM32硬件的CRC不占用MCU的资源,计算速度快。由于硬件CRC需要配置一些选项,配置不对就会导致计算结果错误,导致使用上没有软件计算CRC方便。但硬件CRC更快的速度在一些有时间资源要求的场合还是非…

使用python批量替换文件夹文件名(已亲测)

1. 需要使用高版本的python,本机版本 3.12.4 2. 配置国内Python镜像源 常用的国内Python镜像源: 清华大学TUNA镜像源:这是非常受欢迎的一个镜像源,提供了高速且稳定的服务。 地址:https://pypi.tuna.tsinghua.edu.cn/simple 临时…

基于DCGM+Prometheus+Grafana的GPU监控方案

目录 前言一、指标导出器1、DCGM:获取远程节点的信息 2、 DCGM-Exporter收集多节点信息更改收集指标 二、 Prometheus - From metrics to insight修改配置文件查看收集结果 三、Grafana仪表板展示导入数据源创建仪表板更多仪表板 前言 基于DCGM(NVIDIA …

DNS安全概述

一、DNS的解析过程 1.递归解析 递归解析是一种由DNS客户端(通常是用户的应用程序,如一个浏览器)向本地DNS解析器发出解析请求,然后本地DNS解析器负责查询最终结果并将结果返回给客户端,而中间的所有查询请求都由本地D…

LabVIEW空间相机测控系统

空间相机是遥感技术中的核心设备,其在太空中的性能对任务的成功至关重要。为了确保空间相机能够在极端环境下稳定工作,地面模拟测试成为必不可少的环节。LabVIEW开发的空间相机测控系统,通过对温度、应力和应变等参数进行高精度测量&#xff…

云贝教育 |【技术文章】OpenTenBase_V2.6基于麒麟V10源码编译安装

本文为云贝教育 刘老师 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。 前言:什么是OpenTenBase OpenTenBase 是一个提供写可靠性,多主节点数据同步的关系数据库集群平台。你可以…

LabVIEW智能可变温循环PCT测试系统

随着全球能源危机的加剧和环境保护需求的提升,开发和利用清洁能源已成为全球必然趋势。氢能作为一种高效的替代能源,正逐步受到关注。然而,储氢技术的研究至关重要,尤其是储氢材料的PCT(Pressure-Composition-Temperat…

iTOP-3A5000主控板龙芯自主指令系统外加机箱就是一台电脑主机

性能强采用全国产龙芯3A5000处理器,基于龙芯自主指令系统 (LoongArch)的LA464微结构,并进一步提升频率,降低功耗,优化性能。桥片采用龙芯 7A2000,支持PCIE 3.0、USB 3.0和 SATA 3.0.显示接口2 路、HDMI 和1路 VGA&…

sql数据库命令行操作(数据库的增删改查)

查询数据库 查询电脑里面所有数据库 SHOW DATABASES;查询当前所处的数据库 SELECT DATABASE();应用场景:当我使用了USE命令后不知道自己所在哪个数据库时,可以使用这个命令查询自己所在数据库 创建数据库 创建 CREATE DATABASE [IF NOT EXISTS] 数据…

超好看PC管理门户及手机移动管理门户的模版,可方便快速二次开发

Web 开发中几乎的平台都需要一个后台管理,但是从零开发一套管理后台模版并不容易,幸运的是有很多开源免费的管理后台模版可以给开发者使用。那么有哪些优秀的开源免费的管理后台模版呢? 以下是一些超火和超好看的管理后台模板,它们…

Scala入门基础(11)类的继承

类的继承:好处:复用代码和实现多态 一.复用代码 实现继承要使用extends关键字 演示) 当子类从父类继承的方法不能满足需要时 重写:在子类中重新定义父类的同名方法 实现重写需使用override关键字 。在子类中,可…

工业4G路由钡铼技术R40B智慧城市智能照明控制

随着科技的进步和城市化进程的加快,智慧城市的概念逐渐从理论走向实践,成为现代城市发展的重要趋势。在这一过程中,智能照明作为提升城市品质、节约能源、改善居民生活质量的关键环节,受到了广泛关注。 一、R40B概述 R40B是一款…

基于Java+SpringBoot+Vue的非物质文化网站的设计与开发

基于JavaSpringBootVue的非物质文化网站的设计与开发 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接&#…

非线性关卡设计

【GDC】如何设计完全非线性的单人关卡_DOOM (bilibili.com) 本文章算是此视频的简单笔记,更详细还请看视频 设计完全非线性关卡强调自由移动和沙盒式玩法,鼓励玩家进行不可预测的移动和空间探索。讲解者分享了设计此类关卡的具体步骤,包括明…

清华最新RAG框架:Adaptive-Note RAG,比Adaptive RAG还要好

1. 为什么要提出 Adaptive-Note RAG? RAG(检索增强生成)技术是一种能有效解决LLM(大语言模型)幻觉问题的可靠手段,通过借助外部非参数化知识,帮助LLMs拓展其知识边界。 但是,传统R…

解决:gpg: 从公钥服务器接收失败:服务器故障

当你添加密钥时报错,可以按照下面的步骤,依次输入。 # 停止 Network Manager 服务 sudo service network-manager stop# 删除 Network Manager 的状态文件 sudo rm /var/lib/NetworkManager/NetworkManager.state# 重新启动 Network Manager 服务 sudo …

python 爬虫 入门 一、基础工具

一,网页开发者工具的使用 我们可以用 requests 库来从一个url或者说一个网址来爬取资源,这里以百度主页和windows初始浏览器Microsoft Edge为例,我们进入百度主页后按F12进入开发者模式,我们常用的功能是元素和网络,源…

word,exl,txt转pdf

有些时候需要上传一些附件,比如exl,word,预览的时候客户需要用pdf展示,下面就简答介绍下转换方法 效果图 依赖: 这是我从网上下载到本地然后再依赖的,也可以使用pom文件依赖更好 代码如下: i…

qiankun 应用之间数据传递

qiankun 应用之间数据传递 全局共享 initGlobalState qiankun initGlobalState API 单击前往 qiankun 内部提供了 initGlobalState 方法用于注册 MicroAppStateActions 实例用于通信,该实例有三个方法,分别是onGlobalStateChange、setGlobalState、of…

重塑输电线路运维管理,巡检管理系统守护电网稳定运行

在输电线路巡检管理中,一个高效、直接的巡检系统对于确保电力供应的稳定性和安全性至关重要。巡检系统能够直接对接运维需求,减少繁琐流程,并强化数据分析能力,这无疑为输电线路的运维管理带来了诸多优势。以下是对这些优势的具体…