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.mzph.cn/bicheng/55591.shtml

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

相关文章

Qt系统学习篇(6)-QMainWindow

QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget)&#xff0c;是许多应用程序的基础&#xff0c;如文本编辑器&#xff0c;图片编…

不同环境不同的配置文件;不同地区的数据库连接

不同地区的数据库不同&#xff0c;是怎么找到不同的数据库的 在Spring Boot项目中&#xff0c;如果存在application.yml、application-test.yml、application-prod.yml等多个配置文件&#xff0c;Spring Boot会根据当前激活的配置文件环境来决定使用哪个配置文件。以下是关于如…

MyBatisPlus——学习笔记

MyBatisPlus 一、导入依赖 <!-- MyBatisPlus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!-- MySql --><de…

物理学基础精解【41】

文章目录 核物理基础 Υ \varUpsilon Υ衰变1. Υ \varUpsilon Υ衰变的一般性质2. 具体的衰变模式3. 衰变公式和机制4. 实验观测和理论研究 Υ \varUpsilon Υ衰变概述一、定义二、公式三、定理一、定义二、公式三、定理 重带电粒子概述重带电粒子的性质重带电粒子的公式 重带…

【AIGC】VoiceControl for ChatGPT指南:轻松开启ChatGPT语音对话模式

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;安装VoiceControl for ChatGPT插件&#x1f4af;如何使用VoiceControl for ChatGPT进行语音输入VoiceControl for ChatGPT快捷键注意点 &#x1f4af;VoiceControl for C…

mfc140u.dll缺失?快速解决方法全解析,解决mfc140u.dll错误

当你的电脑出现找不到mfc140u.dll的问题&#xff0c;不少用户在使用电脑时陷入了困扰。这个错误提示就像一道屏障&#xff0c;阻挡了用户正常使用某些软件。无论是办公软件、游戏还是专业的设计工具&#xff0c;一旦出现这个问题&#xff0c;都会导致软件无法正常运行。如果您也…

jQuery 选择器

jQuery 是什么&#xff1f; jQuery 是一个非常流行的 JavaScript 库&#xff0c;它简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。本篇博客将介绍一些常用的 jQuery 方法&#xff0c;帮助你更轻松地使用 jQuery 进行 Web 开发。 一、DOM 选择与遍历 1.1 基本选择器 $…

python:reportlab 将多个图片合并成一个PDF文件

承上一篇&#xff1a;java&#xff1a;pdfbox 3.0 去除扫描版PDF中文本水印 # 导出扫描版PDF文件中每页的图片文件 java -jar pdfbox-app-3.0.3.jar export:images -prefixtest -i your_book.pdf 导出 Writing image: test-1.jpg Writing image: test-2.jpg Writing image: t…

webGL入门(六)图形旋转

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</…

ndb9300public-ndb2excel简介

1 引言 ndb9300是一个自己定义的机载导航数据库劳作&#xff08;不敢称为项目&#xff09;代号&#xff0c;其中3表示是第3种数据库。 多年前&#xff0c;对在役民航客机中的某型机载导航数据库的二进制文件进行分析&#xff0c;弄明白它的数据结构后做了几个工具&#xff0c…

Redis-持久化机制

Redis持久化方式 rdb -> 全量 aof -> 增量 也可以两种同时开启&#xff0c;混合持久化(4.0 后) rdb 简介 配置文件 redis 6.0.16 及其以下 redis 6.2 7.0 配置说明 有两种触发方式&#xff1a;手动&#xff0c;自动 修改 save 5 2dir /myredis/dump (储存的文件夹需…

【机器学习】探索GRU:深度学习中门控循环单元的魅力

目录 &#x1f354; GRU介绍 &#x1f354; GRU的内部结构图 2.1 GRU结构分析 2.2 GRU工作原理 2.4 Bi-GRU介绍 2.3 使用Pytorch构建GRU模型 2.5 GRU优缺点 &#x1f354; 小结 学习目标 &#x1f340; 了解GRU内部结构及计算公式. &#x1f340; 掌握Pytorch中GRU工具…

1000题-计算机网络系统概述

术语定义与其他术语的关系SDU&#xff08;服务数据单元&#xff09;相邻层间交换的数据单元&#xff0c;是服务原语的表现形式。在OSI模型中&#xff0c;SDU是某一层待传送和处理的数据单元&#xff0c;即该层接口数据的总和。 - SDU是某一层的数据集&#xff0c;准备传递给下一…

【开源免费】基于SpringBoot+Vue.JS洗衣店订单管理系统(JAVA毕业设计)

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

vue框架学习 -- 日历控件 FullCalendar 使用总结

最近在项目中要实现日期排班的功能&#xff0c;正好要用到日历视图的控件&#xff0c;经过对比发现&#xff0c;vue 中 使用 FullCalendar 可以实现相关需求&#xff0c;下面对使用过程做一个总结。 一. 引入 FullCalendar 控件 package.json 中添加相关依赖 "dependen…

基于PyQt5和SQLite的数据库操作程序

基于PyQt5和SQLite的数据库操作程序:功能解析 在现代办公和数据处理中,数据库操作是不可或缺的一部分。然而,传统的数据库管理工具往往界面复杂,操作繁琐,对于非专业人士来说存在一定的学习曲线。为了解决这个问题,我们开发了一款基于PyQt5和SQLite的数据库操作程序。该…

【CSS in Depth 2 精译_043】6.5 CSS 中的粘性定位技术 + 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09;第二章 相对单位&#xff08;已完结&#xff09;第三章 文档流与盒模型&#xff08;已完结&#xff09;第四章 Flexbox 布局&#xff08;已…

.net Framework 4.6 WebAPI 使用Hangfire

C# 使用 Hangfire 第一章 .net Framework 4.6 WebAPI 使用Hangfire 文章目录 C# 使用 Hangfire前言一、hangfire是什么?二、hangfire的特点三、.net Framework 中hangfire的使用方法第一步:创建WebAPI控制器第二步:添加nuget包第三步 创建startup类新建项目startup类Startu…

python 实现Luhn (Mod 10)Algorithm算法

Luhn (Mod 10)Algorithm算法介绍 Luhn算法&#xff08;也称为“模10”或Mod 10算法&#xff09;是一种简单的校验和算法&#xff0c;主要用于验证身份识别码&#xff0c;如银行卡号、信用卡号、国际移动设备辨识码&#xff08;IMEI&#xff09;、美国国家提供商标识号码、加拿…

Rust 语言开发 ESP32C3 并在 Wokwi 电子模拟器上运行(esp-hal 非标准库、LCD1602、I2C)

文章目录 esp-rs 简介GithubRust 包仓库Rust 教程Wokwi 电子模拟器开发环境Rust 环境esp-rs 环境创建 ESP32C3 项目项目结构编译项目命令运行模拟器ESP32C3 烧录 esp-rs 简介 esp-rs 是一个专注于为 Espressif 系列芯片&#xff08;如 ESP32、ESP32-S2、ESP32-C3 等&#xff0…