RabbitMQ(死信队列)

一、本文抒写背景

前面我也在延迟队列篇章提到过死信队列,也提到过一些应用场景!

今天呢,这篇文章,主要就是实战一个业务场景的小Demo流程,哈哈,那就是延迟关闭订单。

二、开始啦!let'go!

首先我来讲解下,这个场景非常常见,尤其是和支付挂钩的业务,必然会有类似的场景。

注:

当然,本文重要的是掌握延迟消息的用法,而不是实现一个真实支付的场景!(因为实现真实支付的场景,涉及

的知识太多啦,考虑的情况太多了,呜呜呜,放过我吧!)

三、来吧!Common On,进入代码实现吧!

本章代码实现的整体思路主要为以下:

  • SpringBoot整合RabbitMQ,利用死信队列实现延迟关闭订单的效果。

1. 死信队列原理

利用RabbitMQ的懒消费机制,当消息超过TTL过期时间未被消费,就会通过死信交换机放入死信

队列中,再专门消费死信队列中的消息,达到延迟处理的效果。

一张图看明白

别说啦,前面本人已经提到过死信交换机啦,这张图的思想,跟死信交换机所画图思想有一定的挂钩哟,有兴趣

可参考下本人死信交换机篇章!

2. 实现案例

本文为了突出核心的逻辑,案例就用伪代码来展示啦,省略一些非必要的东西,这样会显得更清晰直观。

创建订单消息对象

// OrderMessage.java
public class OrderMessage {private String orderId;// 省略getter和setter
}

创建订单服务类,也就是执行关闭订单的一些业务逻辑,比如调微信支付关闭订单操作,或改本地业务状态等。

@Service
public class OrderService {public void closeOrder(String orderId) {// 执行关单操作System.out.println("关闭订单:" + orderId);}
}

创建延迟队列配置类,这里的核心就是利用了RabbitMQ的消息过期(ttl)特性,以及定义死信交换机 --> 转发的

路由 --> 死信队列。

@Configuration
public class DelayQueueConfig {// 定义延迟队列名称public static final String DELAY_QUEUE_NAME = "delay.queue";// 定义死信队列名称public static final String DEAD_LETTER_QUEUE_NAME = "dead.letter.queue";// 定义延迟时间(单位:毫秒)public static final long DELAY_TIME = 5000;@Beanpublic Queue delayQueue() {Map<String, Object> args = new HashMap<>();// `x-dead-letter-exchange`被设置为空字符串,表示将死信消息发送到默认交换机。// 如果您想要将死信消息发送到特定的交换机,可以将其设置为相应的交换机名称。args.put("x-dead-letter-exchange", "");args.put("x-dead-letter-routing-key", DEAD_LETTER_QUEUE_NAME);args.put("x-message-ttl", DELAY_TIME);return new Queue(DELAY_QUEUE_NAME, true, false, false, args);}@Beanpublic Queue deadLetterQueue() {return new Queue(DEAD_LETTER_QUEUE_NAME);}
}

创建消息发送者,用于向延迟队列发送订单消息,发送到指定的交换机和延迟队列。

@Component
public class OrderMessageSender {@Autowiredprivate RabbitTemplate rabbitTemplate;@Value(DelayQueueConfig.DELAY_QUEUE_NAME)private String delayQueue;public void sendOrderMessage(OrderMessage orderMessage) {rabbitTemplate.convertAndSend("", delayQueue, orderMessage);}
}

创建消息接收者,也就是监听前面定义的死信队列的消息,消费消息并处理关单逻辑。

@Component
public class OrderMessageReceiver {@Autowiredprivate OrderService orderService;@RabbitListener(queues = DelayQueueConfig.DEAD_LETTER_QUEUE_NAME)public void processDeadLetterMessage(OrderMessage orderMessage) {// 处理关单逻辑orderService.closeOrder(orderMessage.getOrderId());}
}

四、本文总结

最后,咱们再来回顾总结一下利用死信队列实现延迟关单的流程:

1、订单消息通过OrderMessageSender发送到延迟队列。

2、延迟时间过后,订单消息被投递到死信队列。

3、OrderMessageReceiver监听死信队列,一旦有消息到达,调用OrderService的closeOrder方法执行关单

操作。

这种延迟关单功能还可以用于定时任务、订单超时处理等场景。

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

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

相关文章

No.0 笔记 | 从小白到入门:我的渗透测试笔记

嘿&#xff0c;小伙伴们&#xff01;好久不见啊&#xff0c;是不是都以为我失踪了&#xff1f;&#x1f602; 其实呢&#xff0c;最近一直在埋头苦学&#xff0c;感觉自己就像是在技术的海洋里游泳&#xff0c;每天都在吸收新知识。现在终于有时间冒个泡&#xff0c;跟大家分享…

小红书制作视频如何去原视频音乐,视频如何去原声保留背景音乐?

在视频编辑、音乐制作或个人娱乐中&#xff0c;有时我们希望去掉视频中的原声&#xff08;如对话、解说等&#xff09;&#xff0c;仅保留背景音乐。这种处理能让观众更加聚焦于视频的氛围或节奏&#xff0c;同时也为创作者提供了更多创意空间。选择恰当的背景音乐&#xff0c;…

【记录】Excel|Excel 打印成 PDF 页数太多怎么办

【记录】Excel&#xff5c;解决 Excel 打印成 PDF 页数过多的问题 文章目录 【记录】Excel&#xff5c;解决 Excel 打印成 PDF 页数过多的问题方法一&#xff1a;调整页边距WPS OfficeMicrosoft Excel 方法二&#xff1a;优化页面布局调整列宽和行高使用“页面布局”视图合并单…

小程序-使用npm包

目录 Vant Weapp 安装 Vant 组件库 使用 Vant 组件 定制全局主题样式 API Promise化 1. 基于回调函数的异步 API 的缺点 2. 什么是 API Promise 化 3. 实现 API Promise 化 4.调用 Promise 化之后的异步 API 小程序对 npm 的支持与限制 目前&#xff0c;小程序中已经…

BUSHOUND的抓包使用详解

BUSHOUND是个过滤软件&#xff0c;确切来说是在windows操作系统它的驱动层USB传输的数据。所以这个数据上可能是与USB的总线上的数据是有一点差异的。 先要选择设备的抓包。所以就是在device这个界面底下&#xff0c;我们首先要选择我们要抓的设备。 尝试下键盘设备 电脑键盘…

dll动态库加载失败导致程序启动报错以及dll库加载失败的常见原因分析与总结

目录 1、问题说明 2、dll库的隐式加载与动态加载 2.1、dll库的隐式加载 2.2、dll库的显式加载 3、使用Process Explorer查看进程加载的dll库信息以及动态加载的dll库有没有加载成功 3.1、使用Process Explorer查看进程加载的dll库信息 3.2、使用Process Explorer查看动态…

JAVA开源项目 旅游管理系统 计算机毕业设计

本文项目编号 T 063 &#xff0c;文末自助获取源码 \color{red}{T063&#xff0c;文末自助获取源码} T063&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

SpringBoot项目 | 瑞吉外卖 | 短信发送验证码功能改为免费的邮箱发送验证码功能 | 代码实现

0.前情提要 之前的po已经说了单独的邮箱验证码发送功能怎么实现&#xff1a; https://blog.csdn.net/qq_61551948/article/details/142641495 这篇说下如何把该功能整合到瑞吉项目里面&#xff0c;也就是把原先项目里的短信发送验证码的功能改掉&#xff0c;改为邮箱发送验证…

前端学习第一天笔记 HTML5 CSS初学以及VSCODE中的常用快捷键

前端学习笔记 VsCode常用快捷键列表HTML5标题标签标签之段落、换行、水平线标签之图片图片路径详解标签之超文本链接标签之文本列表标签之有序列表列表标签之无序列表标签之表格表格之合并单元格Form表单表单元素文本框 密码框 块元素与行内元素&#xff08;内联元素&#xff0…

阿里云部署1Panel(失败版)

官网脚本部署不成功 这个不怪1panel,这个是阿里Linux 拉不到docker的下载源,懒得思考 正常部署直接打开官网 https://1panel.cn/docs/installation/online_installation/ 但是我使用的阿里云os(Alibaba Cloud Linux 3.2104 LTS 64位) 我执行不管用啊装不上docker 很烦 curl -s…

力扣 简单 110.平衡二叉树

文章目录 题目介绍解法 题目介绍 解法 平衡二叉树:任意节点的左子树和右子树的高度之差的绝对值不超过 1 //利用递归方法自顶向下判断以每个节点为根节点的左右子树的最大深度是否大于1 class Solution {public boolean isBalanced(TreeNode root) {if(root null){return tr…

SPARK调优:AQE特性(含脑图总结)

学完AQE需要能够回答如下的几个问题&#xff1a; 什么是AQE&#xff1f;AQE的实现原理是什么&#xff1f;AQE的特性有哪些&#xff1f;使用什么参数实现&#xff1f;AQE每个特性可以解决什么问题&#xff1f;什么问题是AQE不能解决的 HL&#xff1a;学习脑图如下 SparkAQE是spa…

【2024版本】Mac/Windows IDEA安装教程

IDEA 2024版本真的很强大&#xff0c;此外JDK发布了最新稳定版 JDK21 &#xff0c;只有新版本支持JDK 21、JDK22。原来数据库插件不支持redis等一些NoSql的数据库的连接&#xff0c;如果要使用需要自己单独装收费的插件。直接打开idea就很吃内存了&#xff0c;再打开其他一大堆…

案例-猜数字游戏

文章目录 效果展示初始画面演示视频 代码区 效果展示 初始画面 演示视频 猜数字游戏 代码区 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,…

C++游戏开发详解:从入门到实践

目录 引言 使用C进行游戏开发的优势 常用的C游戏引擎和工具 C游戏引擎比较 开发工具 C游戏开发核心概念与代码示例 面向对象编程&#xff08;OOP&#xff09; 封装 继承 多态 内存管理 手动内存管理 智能指针 内存池 并发编程 多线程 同步机制 游戏开发流程 …

【python】追加写入excel

输出文件运行前&#xff08;有两张表&#xff0c;“表1”和“Sheet1”&#xff09;&#xff1a; 目录 一&#xff1a;写入单表&#xff08;删除所有旧工作表&#xff0c;写入新表&#xff09;二&#xff1a;写入多表&#xff08;删除所有旧工作表&#xff0c;写入新表&#x…

docker环境下配置cerbot获取免费ssl证书并自动续期

文章目录 实践场景了解certbot查看nginx的映射情况操作目标配置nginx配置的ssl证书设置自动续签 实践场景 本人使用docker部署了一个nginx容器&#xff0c;通过容器卷&#xff0c;实现本地html&#xff0c;ssl&#xff0c;conf和ngiinx容器映射的&#xff0c; 经常需要手动部署…

【GEE学习第三期】GEE常用函数总结

【GEE学习第三期】GEE常用函数总结 数据统计类ee.List.sequence函数 图像处理类ee.Geometry类‌defaultVisualizationVis函数 数据输入输出数值与绘图导出影像 参考 数据统计类 ee.List.sequence函数 用法如下&#xff1a; ee.List.sequence &#xff08;开始&#xff0c;结…

【Spring】@RequestMapping、@RestController和Postman

文章目录 1.RequestMapping 注解介绍2. RequestMapping 使用3. RequestMapping 是 GET 还是 POST 请求&#xff1f;GET 请求POST 请求指定 GET/POST 方法类型 2. Postman 介绍1. 创建请求2. 传参介绍1. 普通传参2. form-data3. x-www-form-urlencoded form 表单&#xff0c;对应…

PWM 模式

一、介绍 PWM&#xff08;脉宽调制&#xff0c;Pulse-width modulation&#xff09;是一种通过调节脉冲信号的宽度来控制电能输出的方法。PWM是一种方波信号&#xff0c;通常在电子和电气工程中用于调节功率输送&#xff0c;控制电机速度&#xff0c;调节LED亮度&#xff0c;以…