说明:以前背八股文,早就知道 Redis 可以作为消息队列,本文介绍如何实现用 Redis 作为消息队列。

介绍

这里直接介绍 yudao 框架中的实现。yudao 是一套现成的开源系统框架,里面集成了许多基础功能,我们可以在这基础上实现自己的业务功能,就不用重复造轮子了。

  • 芋道微服务代码部署

将后端代码 clone 到本地,点开系统的基础组件,可以看到在消息队列的模块中有 redis 实现方式。

在这里插入图片描述

使用

(1)Redis版本要求

yudao 使用 Redis 作为消息队列,利用了 Redis 5.0 版本后的 Stream 类型,所以要求 Redis 版本在该版本之上,可参考 yudao 提供的下面这篇文章安装:

  • Redis 安装指南(Windows 版本)

下载后,如果你使用的是 windows 操作系统,可使用管理员打开 CMD,敲下面的命令将 Redis 注册成系统的一个服务

redis-server --service-install ‪D:\dev\Redis-x64-5.0.14.1\redis.windows.conf

其中 ‪D:\dev\Redis-x64-5.0.14.1\redis.windows.conf 更换成自己的 redis 配置文件路径

(2)创建消息和监听器

使用起来很便捷,先创建一个消息对象,继承框架中的 AbstractRedisChannelMessage 类,如下:

import cn.iocoder.yudao.framework.mq.redis.core.pubsub.AbstractRedisChannelMessage;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 学生消息*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class StudentMessage extends AbstractRedisChannelMessage {private Long id;private String name;private String age;
}

再在需要消费该消息的服务里,写一个监听类,继承 AbstractRedisChannelMessageListener 类,泛型指定为需要监听的消息对象

import cn.iocoder.yudao.framework.mq.redis.core.pubsub.AbstractRedisChannelMessageListener;
import cn.iocoder.yudao.module.system.controller.admin.demo.message.StudentMessage;
import org.springframework.stereotype.Service;/*** 学生消息监听器*/
@Service
public class StudentMessageListener extends AbstractRedisChannelMessageListener<StudentMessage> {@Overridepublic void onMessage(StudentMessage message) {System.out.println("收到消息:" + message);}
}

这就完成了,是不是九分甚至十分的便捷?

(3)测试

写个 DemoController,测试验证一下

import cn.iocoder.yudao.framework.mq.redis.core.RedisMQTemplate;
import cn.iocoder.yudao.module.system.controller.admin.demo.message.StudentMessage;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/system/demo")
public class DemoController {@Resourceprivate RedisMQTemplate redisMQTemplate;@GetMapping("/hello")public String hello() {return "hello";}@GetMapping("/send")public String send() {StudentMessage studentMessage = new StudentMessage().setId(10001L).setName("zhangsan").setAge("男");redisMQTemplate.send(studentMessage);return "success";}
}

启动项目,先登录拿个 token

在这里插入图片描述

调用发送消息接口,请求头上带上 token,发送消息成功

在这里插入图片描述

监听器消费了消息

在这里插入图片描述

扩展

yudao 框架还增加了一个拦截器 RedisMessageInterceptor,继承该类,可实现在发送、消费消息前后执行相应业务,如下:

import cn.iocoder.yudao.framework.mq.redis.core.interceptor.RedisMessageInterceptor;
import cn.iocoder.yudao.framework.mq.redis.core.message.AbstractRedisMessage;
import cn.iocoder.yudao.module.system.controller.admin.demo.message.StudentMessage;
import org.springframework.stereotype.Component;/*** 学生消息拦截器*/
@Component
public class StudentMessageInterceptor implements RedisMessageInterceptor {@Overridepublic void sendMessageBefore(AbstractRedisMessage message) {if (message instanceof StudentMessage) {System.out.println("发送消息前。。。。。");}}@Overridepublic void sendMessageAfter(AbstractRedisMessage message) {if (message instanceof StudentMessage) {System.out.println("发送消息后。。。。。");}}@Overridepublic void consumeMessageBefore(AbstractRedisMessage message) {if (message instanceof StudentMessage) {System.out.println("消费消息前。。。。。");}}@Overridepublic void consumeMessageAfter(AbstractRedisMessage message) {if (message instanceof StudentMessage) {System.out.println("消费消息后。。。。。");}}
}

比如,可以将发送消息、消费消息记录到数据库表中

在这里插入图片描述

总结

本文介绍了 yudao 框架里如何用 Redis 作为消息队列

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

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

相关文章

解决 uniapp 修改index.html文件不生效的问题

业务场景&#xff1a;需要在H5网站设置追踪用户行为&#xff08;即埋点&#xff09;的script代码。 问题&#xff1a;无论如何修改根目录下的index.html文件都不会生效 问题原因&#xff1a;在 manifest.json 文件中有个【web配置】—>【index.html模版路径】&#xff0c;…

C语言第十一章内存在数据中的存储

一.整数在内存中的存储在计算机内存中&#xff0c;所有的数字都是以二进制来存储的。整数也不例外&#xff0c;在计算机内存中&#xff0c;整数往往以补码的形式来存储数据。这是为什么呢&#xff1f;在早期计算机表示整数时&#xff0c;最高位为符号位。但是0却有两种表示形式…

K8s部署dashboard平台和基本使用

Kubernetes 的默认 Dashboard 主要用于基本的资源查看与管理,如查看 Pod、Service 等资源的状态,进行简单的创建、删除操作 。然而,在企业级复杂场景下,其功能显得较为局限。 与之相比,开源的 Kubernetes Dashboard 增强版工具 ——Dashboard UI ,为用户带来了更强大的功…

JavaEE进阶-文件操作与IO流核心指南

文章目录JavaEE进阶文件操作与IO流核心指南前言&#xff1a;为什么需要文件操作&#xff1f;一、java.io.File 类的基本用法1.1 文件路径1.2 常用方法示例获取文件信息创建和删除文件目录操作文件重命名和移动二、IO流的基本概念2.1 核心困境&#xff1a;字节流 vs. 字符流字节…

动手学深度学习03-线性神经网络

动手学深度学习pytorch 参考地址&#xff1a;https://zh.d2l.ai/ 文章目录动手学深度学习pytorch1-第03章-线性神经网络1. 线性回归1.1 什么是线性回归&#xff1f;1.2 如何表示线性回归的预测公式&#xff1f;2. 损失函数2.1 什么是损失函数&#xff1f;2.2 如何表示整个训练集…

如何安全解密受限制的PDF文件

当你需要从PDF中复制一段文字用于报告或引用时&#xff0c;如果文件被禁止复制&#xff0c;解密后即可轻松提取内容&#xff0c;避免手动输入的麻烦。它解压后双击主程序即可运行&#xff0c;无需安装&#xff0c;即开即用&#xff0c;十分便捷。建议先将界面语言切换为中文&am…

利用DeepSeek辅助编译c#项目tinyxlsx生成xlsx文件

继续在寻找比较快的xlsx写入库&#xff0c;从https://github.com/TinyXlsx/TinyXlsx/ 看到它的测试结果&#xff0c;比c的openXLSX快几倍&#xff0c;就想试用一下&#xff0c;仔细一看&#xff0c;它是个c#项目&#xff0c;需要.NET 8.0。 于是上微软网站下载了.NET 8.0 SDK&a…

构建现代高并发服务器:从内核机制到架构实践

引言:高并发的挑战与演进 在当今互联网时代,高并发处理能力已成为服务器的核心竞争力。传统的"一个连接一个线程"(Thread-per-Connection)模型由于资源消耗巨大、上下文切换成本高和可扩展性差,早已无法应对数万甚至百万级的并发连接需求。现代高并发服务器基于…

1SG10MHN3F74C2LG Intel Stratix 10 系列 FPGA

1SG10MHN3F74C2LG 是 Intel 推出的 Stratix 10 系列 FPGA 家族中的高端型号&#xff0c;它基于 Intel 与 TSMC 合作的 14 纳米 FinFET 工艺制造&#xff0c;是面向超高性能计算、数据中心加速、5G 通信基础设施、以及高端网络设备的旗舰级可编程逻辑器件。这颗 FPGA 以极高的逻…

IIS访问报错:HTTP 错误 500.19 - Internal Server Error

无法访问请求的页面&#xff0c;因为该页的相关配置数据无效。 由于权限不足而无法读取配置文件解决办法&#xff1a;文件夹添加用户权限Everyone文件夹->鼠标右键->属性->安全->组或用户名->编辑->添加->录入Everyone->检查名称->一路点确定

AI对口型唱演:科技赋能,开启虚拟歌者新篇章

最近在短视频平台闲逛&#xff0c;发现不少朋友都在玩“AI对口型唱演”&#xff0c;这类视频简直成了新晋流量密码。从热门歌曲到经典台词&#xff0c;配上夸张的口型和表情&#xff0c;分分钟就能冲上排行榜前排。不过问题也来了——市面上这么多专用软件&#xff0c;到底哪家…

爬虫逆向--Day16Day17--核心逆向案例3(拦截器关键字、路径关键字、请求堆栈、连续请求)

一、入口定位入口定位-- 关键字搜索-- 方法关键字--最简单&#xff0c;最高效的 排第一-- encrypt 加密-- decrypt 解密-- JSON.stringify 给一个JS对象做Json字符串处理的把一个对象转换为Json字符串JSON.stringify({a:1,b:"2"}){"a":"1…

RuoYi-Vue3项目中Swagger接口测试404,端口问题解析排查

一 问题概述版本&#xff1a;ruoyi前后端分离版&#xff0c;ruoyi版本3.9.0 前端Vue3 后端Spring Boot 2.5.15 本地测试环境ruoyi界面中系统工具下的系统接口集成了Swagger&#xff0c;当对其页面上的接口进行请求测试时却发生了404报错。具体表现如下图二 问题排查 1、与Vue2进…

elasticsearch 7.x elasticsearch 使用scroll滚动查询一页,删除一页,影响后面滚动的查询吗

目录 一 scroll说明 1.1 问题 1.2 scroll分页的机制 1.3 案例分析 一 scroll说明 1.1 问题 elasticsearch 使用scroll滚动查询一页&#xff0c;删除一页&#xff0c;影响后面滚动的查询吗&#xff1f; 答案是&#xff1a; 在 Elasticsearch 中使用 Scroll API 进行“…

MacBook Pro M1升级Burp Suite2025.8

一、安装最新Burp Suite2025.8 下载最新Burp Suite2025.8安装包&#xff1a; Burp Suite Release Notes 下载安装包后&#xff0c;双击安装即可&#xff0c; 二、调整Burp Suite2025.8配置&#xff1b; 工具包下载地址&#xff1a;文件分享 将下载的jar包放到app目录下即可 …

开发避坑指南(30):Vue3 表格动态增加删除行解决方案

需求背景 在Vue3环境中&#xff0c;动态增加或者删除表格的行&#xff0c;该怎么实现&#xff1f;如下图&#xff1a;实现分析 不同于传统js&#xff0c;jquery等框架的面向dom编程&#xff0c;vue中是面向数据编程。对变量的增删自动绑定到dom节点的增删上&#xff0c;所以在v…

RTSP/RTMP vs WebRTC:实时视频技术选型的务实之路

引言&#xff1a;错配的代价 在实时视频的技术选型中&#xff0c;WebRTC 曾一度被许多团队视为“唯一的正确答案”。凭借浏览器原生支持、点对点传输以及端到端的低时延特性&#xff0c;它确实在在线会议、互动课堂等场景中展现了极大优势。然而&#xff0c;当这些团队尝试把同…

图表组件SciChart WPF再升级:v8.9带来油气井图、新交互与可视化增强

SciChart WPF Charts是一个实时、高性能的WPF图表库&#xff0c;专为金融、医疗和工程应用而设计。使用DirectX和SciChart WPF专有渲染引擎&#xff0c;以及约50种2D和3D WPF图表类型、灵活的API和五星级支持&#xff0c;SciChart非常适合需要极端性能和光滑交互式图表的项目。…

基于5G NR NTN与DVB-S2X/RCS2的机载卫星通信终端性能分析

5G NR NTN与DVB-S2X/RCS2代表了两种不同的卫星通信技术路线&#xff0c;分别针对航空通信的不同需求场景提供差异化解决方案。5G NR NTN作为蜂窝网络向太空的延伸&#xff0c;具备低延迟、双向通信优势&#xff0c;而DVB-S2X/RCS2则专注于高带宽广播和回传控制&#xff0c;两者…

show-overflow-tooltip使用当内容过多不展示...

Element UI的show-overflow-tooltip属性依赖于检测文本内容的实际宽度与容器宽度的比较&#xff0c;当使用<div>等块级元素时&#xff0c;会破坏这个检测机制。解决方案移除div包装&#xff1a;直接在模板中使用文本内容&#xff0c;不要用div包装使用span代替div&#x…