JAVA:利用 RabbitMQ 死信队列实现支付超时场景的技术指南

1、简述

在支付系统中,订单支付的超时自动撤销是一个非常常见的业务场景。通常用户未在规定时间内完成支付,系统会自动取消订单,释放相应的资源。本文将通过利用 RabbitMQ 的 死信队列(Dead Letter Queue, DLQ)来实现支付超时自动撤销功能,并详细讲解如何在 Java 中进行实现。

在这里插入图片描述

2、什么是死信队列?

死信队列是 RabbitMQ 中的一个重要功能,当消息在某个队列中变成“死信”时,可以被发送到另一个特殊的队列,这个队列就是死信队列。消息变成死信的情况有三种:

  • 消息被拒绝(basic.reject 或 basic.nack),并且 requeue=false。
  • 消息的 TTL(Time to Live)过期。
  • 队列达到最大长度,无法再存入新消息。

通过死信队列,我们可以处理一些特殊的业务逻辑,例如订单支付超时自动撤销。

3、实现过程

我们将为每个新创建的支付订单设置一个超时时间(例如 30 分钟),在订单支付的过程中将订单的消息发送到 RabbitMQ。消息在 RabbitMQ 中设置一定的 TTL(生存时间)。如果用户在超时时间内完成支付,消息会被正常处理;如果超时未支付,消息会成为“死信”,被转移到死信队列,从而触发订单撤销的逻辑。

3.1 环境准备

首先,在 pom.xml 中添加 RabbitMQ 相关依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
3.2 RabbitMQ 配置

在 application.yml 中添加 RabbitMQ 的连接配置:

spring:rabbitmq:host: localhostport: 5672username: guestpassword: guest
3.3 配置普通队列和死信队列

我们需要配置两个队列,一个是正常的支付订单队列,另一个是死信队列。

  • 支付订单队列:用于接收支付订单的消息。
  • 死信队列:接收从支付订单队列中转移过来的超时未处理的消息。
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {// 正常交换机@Beanpublic DirectExchange orderExchange() {return new DirectExchange("order-exchange");}// 死信交换机@Beanpublic DirectExchange deadLetterExchange() {return new DirectExchange("dead-letter-exchange");}// 正常队列@Beanpublic Queue orderQueue() {return QueueBuilder.durable("order-queue").withArgument("x-dead-letter-exchange", "dead-letter-exchange") // 绑定死信交换机.withArgument("x-dead-letter-routing-key", "dead-letter-routing-key") // 死信路由键.withArgument("x-message-ttl", 1800000) // 消息的TTL(30分钟).build();}// 死信队列@Beanpublic Queue deadLetterQueue() {return QueueBuilder.durable("dead-letter-queue").build();}// 绑定正常队列和交换机@Beanpublic Binding orderBinding(Queue orderQueue, DirectExchange orderExchange) {return BindingBuilder.bind(orderQueue).to(orderExchange).with("order-routing-key");}// 绑定死信队列和死信交换机@Beanpublic Binding deadLetterBinding(Queue deadLetterQueue, DirectExchange deadLetterExchange) {return BindingBuilder.bind(deadLetterQueue).to(deadLetterExchange).with("dead-letter-routing-key");}
}
3.4 发送订单支付消息

在订单创建时,我们将消息发送到 RabbitMQ,设置 TTL(超时时间):

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class OrderService {@Autowiredprivate RabbitTemplate rabbitTemplate;public void createOrder(String orderId) {// 模拟创建订单的逻辑System.out.println("订单创建成功,订单ID:" + orderId);// 发送订单消息到RabbitMQrabbitTemplate.convertAndSend("order-exchange", "order-routing-key", orderId);System.out.println("订单消息已发送,等待支付超时或支付完成处理...");}
}
3.5 监听死信队列,实现超时自动撤销订单

当订单超时未支付,消息将转移到死信队列,我们通过监听死信队列,实现订单撤销逻辑:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class DeadLetterQueueListener {@RabbitListener(queues = "dead-letter-queue")public void handleExpiredOrder(String orderId) {// 处理超时订单撤销的逻辑System.out.println("订单支付超时,自动撤销订单,订单ID:" + orderId);// TODO: 更新数据库订单状态为已取消}
}

4、总结

通过使用 RabbitMQ 的死信队列,我们可以轻松实现支付超时自动撤销的功能。具体流程如下:

  • 创建订单时,将订单消息发送到 RabbitMQ,并为消息设置 TTL。
  • 如果用户在规定时间内完成支付,系统处理消息,订单正常完成。
  • 如果消息在 TTL 时间内未被处理,消息进入死信队列,触发自动撤销逻辑。

利用 RabbitMQ 死信队列可以确保超时订单得到及时处理,避免资源浪费,同时还能保证系统的高并发处理能力。

这套方案可以扩展应用于任何有类似超时要求的业务场景,如购物车超时、订单确认超时等。

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

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

相关文章

特制一个自己的UI库,只用CSS、图标、emoji图 第二版

图&#xff1a; 代码&#xff1a; index.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>M…

1.14 互斥与同步

1.思维导图 2.有一个隧道&#xff0c;长1000m&#xff0c;有一辆高铁&#xff0c;每秒100米&#xff1b;有一辆快车&#xff0c;每秒50米&#xff1b;要求模拟这两列火车通过隧道的场景。 1>程序代码&#xff1a; #include <stdio.h> #include <string.h> #i…

14.STM32F407ZGT6-SPI

参考&#xff1a; 1.正点原子 前言&#xff1a; SPI一般用在中高速的外围器件上&#xff0c;如FLASH, GPS模块等。很常用的一种通信方式&#xff0c;学习总结很有必要。 1.SPI的概念及时序。 2.通过SPI操作Flash芯片。 37.1 SPI 及 NOR Flash 介绍 37.1.1 SPI 介绍 我们将从…

基于SpringBoot的中华诗词赏析文化交流平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

GPU算力平台|在GPU算力平台部署Qwen-2通义千问大模型的教程

文章目录 一、GPU平台介绍算力平台概述 二、人工智能应用开发需要GPU算力平台GPU算力原理账号注册流程Qwen-2通义千问大模型的部署登录/注册选择SettingsURL配置选择模型部署完成进行问答 一、GPU平台介绍 算力平台概述 GPU算力平台是一个专注于GPU加速计算的专业云服务平台&…

微信小程序集成Vant Weapp移动端开发的框架

什么是Vant Weapp Vant 是一个轻量、可靠的移动端组件库&#xff0c;于 2017 年开源。 目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本&#xff0c;并由社区团队维护 React 版本和支付宝小程序版本。 官网地睛&#xff1a;介绍 - Vant Weapp (vant-ui.gith…

图形和动画本地化

图形和动画本地化是多媒体改编的一个关键方面&#xff0c;需要对技术技能和文化细微差别有深入的理解。当由母语人士和设计师进行时&#xff0c;这一过程达到了自动化系统通常无法复制的真实性和相关性水平。 本土专业人士对文化偏好、象征主义和视觉美学有着固有的理解&#…

浅谈云计算06 | 云管理系统架构

云管理系统架构 一、云管理系统架构&#xff08;一&#xff09;远程管理系统&#xff08;二&#xff09;资源管理系统&#xff08;三&#xff09;SLA 管理系统&#xff08;四&#xff09;计费管理系统 二、安全与可靠性保障&#xff08;一&#xff09;数据安全防线&#xff08;…

SpringBoot 基础学习

对于SpringBoot的了解&#xff0c;在初学者的角度看来&#xff0c;它是一种工具&#xff0c;用于简化一个Spring项目的初始搭建和开发过程。 1 入门案例 1.1 项目的创建 有四种方法创建&#xff0c;可以通过idea快捷创建&#xff0c;Spring的官网创建&#xff0c;阿里云创建&am…

基于springboot+vue的洪涝灾害应急信息管理系统设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

QTreeWidget QTreeWidgetItem

QTreeWidgetItem 是 Qt 框架中用于在 QTreeWidget 中表示树形结构中每个节点的类。它是 QTreeWidget 的一部分&#xff0c;允许您创建和管理层次结构的数据展示。 QTreeWidgetItem 用于表示树形结构中的单个节点。 添加子节点&#xff1a; 可以通过 addChild() 方法向节点添加…

基于springboot果蔬供应链信息管理平台

基于Spring Boot的果蔬供应链信息管理平台是一种集成了先进信息技术和果蔬供应链管理理念的综合性系统。 一、背景与意义 随着人们生活水平的提高和对健康饮食的重视&#xff0c;果蔬市场需求不断增长。然而&#xff0c;果蔬供应链涉及多个环节&#xff0c;包括种植、采摘、加…

25/1/13 嵌入式笔记 继续学习Esp32

PWM&#xff08;Pulse Width Modulation&#xff0c;脉宽调制&#xff09; 是一种通过快速切换高低电平来模拟中间电压值的技术。它广泛应用于控制 LED 亮度、电机速度、音频生成等场景。 analogWrite函数:用于在微控制器&#xff08;如 Arduino&#xff09;上生成模拟信号。 …

jupyter notebook练手项目:线性回归——学习时间与成绩的关系

线性回归——学习时间与学习成绩的关系 第1步&#xff1a;导入工具库 pandas——数据分析库&#xff0c;提供了数据结构&#xff08;如DataFrame和Series&#xff09;和数据操作方法&#xff0c;方便对数据集进行读取、清洗、转换等操作。 matplotlib——绘图库&#xff0c;p…

如何规模化实现完全自动驾驶?Mobileye提出解题“新”思路

在CES 2025上&#xff0c;Mobileye展示了端到端自动驾驶系统Mobileye Drive™&#xff0c;通过高度集成的传感器、算法和计算平台&#xff0c;可以实现自动驾驶功能的全覆盖。 Mobileye创始人兼首席执行官Amnon Shashua教授 期间&#xff0c;Mobileye创始人兼首席执行官Amnon …

Windows下安装和配置Go开发环境

文章目录 1. 介绍了SDK2. 下载 SDK工具包3. windows 下配置 Golang 环境变量 1. 介绍了SDK SDK 的全称(Software Development Kit 软件开发工具包)SDK是提供给开发人员使用的&#xff0c;其中包含了对应开发语言的工具包 2. 下载 SDK工具包 Go语言的官网为&#xff1a;https…

【javascript】Web APIs-Dom获取属性操作

目录 Web APIs-Dom获取&属性操作 Web API 基本认知 变量声明 建议&#xff1a; const 优先&#xff0c;尽量使用const&#xff0c;原因是&#xff1a; 1.1 作用和分类 1.2 什么是DOM 1.3 DOM树 1.4 DOM对象&#xff08;重要&#xff09; 2. 获取DOM对象 2.1 根据C…

新版AndroidStudio通过系统快捷创建带BottomNavigationView的项目踩坑记录

选择上面这个玩意创建的项目 坑点1 &#xff1a;配置的写法和不一样了 镜像的写法&#xff1a; 新的settings.gradle.kts中配置镜像的代码&#xff1a; pluginManagement {repositories {mavenCentral()google {content {includeGroupByRegex("com\\.android.*")…

SAP资产盘盈盘亏的过账处理、入账价值错误调整、资产减值准备

文章目录 一、SAP资产盘盈盘亏处理1、ABNAN盘盈 &#xff08;往年资产&#xff09; ABZON (当年资产&#xff09;2、ABAVN盘亏 二、资产价值入账错了&#xff08;价值多了或少了&#xff09;&#xff0c;怎么调账1、价值少了2、价值多了 三、资产减值准备1、启用重估2、指定间隔…

炸砖块游戏的最终图案

描述 小红正在玩一个“炸砖块”游戏,游戏的规则如下:初始有一个 n * m 的砖块矩阵。小红会炸 k 次,每次会向一个位置投炸弹,如果这个位置有一个砖块,则砖块消失,上方的砖块向下落。小红希望你画出最终砖块的图案。 输入描述 第一行输入三个正整数 n, m, k,代表矩阵的行…