当前位置: 首页 > news >正文

SpringBoot 实现订单30分钟自动取消的策略

简介

在电商和其他涉及到在线支付的应用中,通常需要实现一个功能:如果用户在生成订单后的一定时间内未完成支付,系统将自动取消该订单。

本文将详细介绍基于Spring Boot框架实现订单30分钟内未支付自动取消的几种方案,并提供实例代码。

方案一:定时任务

利用Spring Boot中的@Scheduled注解,我们可以轻松地实现定时任务。该任务将周期性地扫描数据库,检查未支付的订单,如果订单生成30分钟未支付,则自动取消。

@Component
public class OrderCancelSchedule {@Autowiredprivate OrderService orderService;@Scheduled(cron = "0 0/1 * * * ?")public void cancelUnpaidOrders() {List<Order> unpaidOrders = orderService.getUnpaidOrders();unpaidOrders.forEach(order -> {if (order.getCreationTime().plusMinutes(30).isBefore(LocalDateTime.now())) {orderService.cancelOrder(order.getId());}});}
}

方案二:延迟队列

使用消息队列(如RabbitMQ)的延迟队列功能,当订单生成时将订单ID推送到延迟队列,设置30分钟后过期,过期后消费该消息,取消订单。

@Service
public class OrderService {@Autowiredprivate RabbitTemplate rabbitTemplate;public void createOrder(Order order) {// 保存订单至数据库saveOrderToDB(order);// 将订单ID推送至延迟队列rabbitTemplate.convertAndSend("orderDelayExchange", "orderDelayKey", order.getId(), message -> {message.getMessageProperties().setDelay(30 * 60 * 1000); // 设置延迟时间return message;});}
}@Component
@RabbitListener(queues = "orderDelayQueue")
public class OrderDelayConsumer {@Autowiredprivate OrderService orderService;@RabbitHandlerpublic void process(String orderId) {// 取消订单orderService.cancelOrder(orderId);}
}

方案三:Redis过期事件

利用Redis的键过期事件功能,当订单生成时在Redis中存储一个键,设置30分钟过期,键过期时通过Redis的过期事件通知功能触发订单取消操作。

@Service
public class OrderService {@Autowiredprivate StringRedisTemplate redisTemplate;public void createOrder(Order order) {// 保存订单至数据库saveOrderToDB(order);// 在Redis中存储一个键,设置30分钟过期redisTemplate.opsForValue().set("order:" + order.getId(), order.getId(), 30, TimeUnit.MINUTES);}// 当键过期时,Redis会自动调用该方法(需要配置Redis的过期事件通知功能)public void onOrderKeyExpired(String orderId) {cancelOrder(orderId);}
}

补充一下配置Redis的过期事件通知功能如下:

Redis的键过期通知是一种典型的发布-订阅模式。在Redis中,我们可以订阅到某些特定的事件。键过期事件就是其中之一。但需要注意,要使用这个功能,需要确保你的Redis服务器开启了相关配置。 下面是具体的步骤和示例:

1.首先需要确保Redis的配置文件(通常是redis.conf)中开启了键空间通知功能。你可以通过在配置文件中添加或修改如下配置实现:

notify-keyspace-events "Ex"

这里的"Ex"表示只监听键过期事件。如果需要监听其他类型的事件,可以参考Redis官方文档进行配置。

2.然后在Spring Boot应用中,可以使用RedisMessageListenerContainer来订阅Redis的键过期事件,并指定回调方法进行处理。示例如下:

@Configuration
public class RedisConfig {@Autowiredprivate RedisConnectionFactory redisConnectionFactory;@BeanRedisMessageListenerContainer container() {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(redisConnectionFactory);// 订阅所有db的过期事件container.addMessageListener(new MessageListener() {@Overridepublic void onMessage(Message message, byte[] pattern) {String expiredKey = message.toString();if (expiredKey.startsWith("order:")) {// 处理订单超时逻辑String orderId = expiredKey.split(":")[1];// 这里调用你的服务类方法,处理订单超时逻辑// orderService.cancelOrder(orderId);}}}, new PatternTopic("__keyevent@*__:expired"));return container;}
}

在这个示例中,"__keyevent@*__:expired"是一个模式匹配的主题,它可以匹配所有数据库的键过期事件。当一个键过期时,onMessage方法会被调用,你可以在这里加入你的逻辑来处理订单的超时取消。

请注意,这里的代码只是一个基本示例。在实际使用中,你可能需要根据自己的需要对代码进行相应的调整和优化。

总结

以上三种方案都可以实现订单在30分钟内未支付则自动取消的需求。根据实际业务需求、系统负载和其他因素,可以选择最适合自己系统的实现方案。每种方案都有其优缺点,需要根据具体情况权衡。

相关文章:

SpringBoot 实现订单30分钟自动取消的策略

简介 在电商和其他涉及到在线支付的应用中&#xff0c;通常需要实现一个功能&#xff1a;如果用户在生成订单后的一定时间内未完成支付&#xff0c;系统将自动取消该订单。 本文将详细介绍基于Spring Boot框架实现订单30分钟内未支付自动取消的几种方案&#xff0c;并提供实例…...

Qt篇——QwtPainter::drawPie绘制扇形

QwtPainter::drawPie(QPainter *painter, const QRectF &rect, int startAngle, int angle); 一、参数含义&#xff1a; painter&#xff1a; 重绘函数中的painter对象 rect&#xff1a; 要绘制扇形的圆的外切矩形。 startAngle: 要绘制的扇形的起始角 …...

Mybatis Java API - SqlSession

正如前面提到的&#xff0c;​SqlSession​实例是MyBatis中最重要、最强大的类。它是您将找到执行语句、提交或回滚事务以及获取映射器实例的所有方法的地方。 SqlSession 类上有超过二十个方法&#xff0c;让我们将它们分成更易理解的组别。 Statement Execution Methods-语…...

java freemarker 动态生成excel文件

好久木有更新啦 抓住2023的小尾巴 浅浅更新一下吧~ 最近做了一个动态生成excel的功能&#xff0c;这里记录下部分功能&#xff0c;主要用到的是freemarker框架&#xff0c;spring就有带&#xff0c;我起的demo载入了一下freemarker的jar包 一、创建模板 首先可以创建一个e…...

第38节: Vue3 鼠标按钮修改器

在UniApp中使用Vue3框架时&#xff0c;你可以使用按键修饰符来更精确地处理键盘事件。以下是一个示例&#xff0c;演示了如何在UniApp中使用Vue3框架使用.left、.right和.middle按键修饰符&#xff1a; <template> <view> <input keydown"handleKeyDown&…...

redis cluster判断key属于那个分片。

一、判断阿里云 redis cluster&#xff0c;的key属于那个分片。 阿里云特有的命令info key 可以查看key属于那个slot&#xff0c;那个分片 命令行查看&#xff1a; xxxx:6379> info key xxxx_compressed_xxx slot:4941 node_index:9 xxxx:6379> cluster keyslot xxxx_…...

Centos7:Jenkins+gitlab+node项目启动(3)

Centos7&#xff1a;Jenkinsgitlabnode项目启动(1) Centos7&#xff1a;Jenkinsgitlabnode项目启动(1)-CSDN博客 Centos7&#xff1a;Jenkinsgitlabnode项目启动(2) Centos7&#xff1a;Jenkinsgitlabnode项目启动(2)-CSDN博客 Centos7&#xff1a;Jenkinsgitlabnode项目启…...

Linux安装GitLab教程

Linux安装GitLab教程 1、配置yum源 相当于新建一个文件&#xff0c;通过这个文件来安装gitlab vim /etc/yum.repos.d/gitlab-ce.repo 把这些配置粘进去 [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gp…...

react 之 美团案例

1.案例展示 2.环境搭建 克隆项目到本地&#xff08;内置了基础静态组件和模版&#xff09; git clone http://git.itcast.cn/heimaqianduan/redux-meituan.git 安装所有依赖 npm i 启动mock服务&#xff08;内置了json-server&#xff09; npm run serve 启动前端服务 npm…...

C基础使用

return 0; 语句用于表示退出程序。 一个程序有且只能有一个main函数的存在 安装编译环境&#xff1a; 安装vim: ubuntu里vim编辑器使用方法_ubuntu vim-CSDN博客 编译与运行&#xff1a; gcc hello.c //编译源文件 ./a.out //运行…...

Linux网络编程——Socket编程步骤及常用API

Sockt服务器和客户端的开发步骤 TCP connect()最好建立在listen()后&#xff0c;一旦监听到就建立连接。 UDP 常用API 包含头文件 #include<sys/types.h> #include<sys/socket.h>创建套接字&#xff08;连接协议&#xff09; 作用 用于根据指定的地址族、数据…...

数据挖掘 K-Means聚类

未格式化之前的代码&#xff1a; import pandas as pd#数据处理 from matplotlib import pyplot as plt#绘图 from sklearn.preprocessing import MinMaxScaler#归一化 from sklearn.cluster import KMeans#聚类 import os#处理文件os.environ["OMP_NUM_THREADS"] …...

医疗卫生行业网络安全需求发展

文章目录 一、行业安全建设需求分析1、等级保护2.0合规建设云计算技术大数据技术物联网技术移动互联网技术2、加强医疗数据安全保护加密存储与传输数据加强数据备份与恢复注重数据脱敏与分级保护3、强化网络安全制度管理完善应急预案与响应机制加强网络安全人员管理二、行业新技…...

【Unity热更新】学会AssetsBundle打包、加载、卸载

本教程详细讲解什么是AssetBundle压缩包机制!然后构建 AssetBundle、加载 AssetBundle 以及卸载 AssetBundle 的简要教程。这一个流程就是热更新! AssetBundles 简介 1.什么是AssetBundles? AssetBundles是Unity中一种用于打包和存储资源(如模型、纹理、声音等)的文件格…...

智能优化算法应用:基于指数分布算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于指数分布算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于指数分布算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.指数分布算法4.实验参数设定5.算法结果6.…...

vue 监听浏览器关闭或刷新事件

vue 监听浏览器关闭或刷新事件 需求 web项目中使用socket时&#xff0c;涉及到关闭刷新浏览器多次连接问题&#xff0c;其中一个解决方法是在关闭或刷新浏览器时&#xff0c;将连接断开。 代码 <script> export default {// 可以在created、beforeMount或mounted生命…...

VuePress-theme-hope 搭建个人博客 2【快速上手】 —— 安装、部署 防止踩坑篇

续&#x1f446;VuePress、VuePress-theme-hope 搭建个人博客 1【快速上手】 项目常用命令 vuepress dev [dir] 会启动一个开发服务器&#xff0c;以便让你在本地开发你的 VuePress 站点。vuepress build [dir] 会将你的 VuePress 站点构建成静态文件&#xff0c;以便你进行后…...

ClickHouse基础知识(四):ClickHouse 引擎详解

1. 表引擎的使用 表引擎是 ClickHouse 的一大特色。可以说&#xff0c; 表引擎决定了如何存储表的数据。包括&#xff1a; ➢ 数据的存储方式和位置&#xff0c;写到哪里以及从哪里读取数据。 默认存放在/var/lib/clickhouse/data ➢ 支持哪些查询以及如何支持。 ➢ 并发数…...

关于设计模式、Java基础面试题

前言 之前为了准备面试&#xff0c;收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文&#xff1a;https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv 设计模式 单例共有几种写法&#xff1f; 细分起来就有9种&#xff1a;懒汉&#x…...

Python爱心光波完整代码

文章目录 环境需求完整代码详细分析环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.blog.csdn.net/arti…...

PowerShell Instal 一键部署gitea

gitea 前言 Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来…...

C语言——指针题目“指针探测器“

如果你觉得你指针学的自我感觉良好&#xff0c;甚至已经到达了炉火纯青的地步&#xff0c;不妨来试试这道题目&#xff1f; #include<stdio.h> int main() {char* c[] { "ENTER","NEW","POINT","FIRST" };char** cp[] { c 3…...

Hive讲课笔记:内部表与外部表

文章目录 一、导言二、内部表1.1 什么是内部表1.1.1 内部表的定义1.1.2 内部表的关键特性 1.2 创建与操作内部表1.2.1 创建并查看数据库1.2.2 在park数据库里创建student表1.2.3 在student表插入一条记录1.2.4 通过HDFS WebUI查看数据库与表 三、外部表2.1 什么是外部表2.2 创建…...

Docker本地部署开源浏览器Firefox并远程访问进行测试

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…...

PHP:服务器端脚本语言的瑰宝

PHP&#xff08;Hypertext Preprocessor&#xff09;是一种广泛应用于服务器端编程的开源脚本语言&#xff0c;它以其简单易学、灵活性和强大的功能而成为Web开发的瑰宝。本文将深入介绍PHP的历史、特性、用途以及与生态系统的关系&#xff0c;为读者提供对这门语言全面的了解。…...

【MySQL】数据库并发控制:悲观锁与乐观锁的深入解析

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 数 据 库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 悲观锁&#xff08;Pessimistic Locking&#xff09;: 乐观锁&#xff08;Optimistic Locking&#xff09;: 总结&#x…...

作业--day38

1.定义一个Person类&#xff0c;包含私有成员&#xff0c;int *age&#xff0c;string &name&#xff0c;一个Stu类&#xff0c;包含私有成员double *score&#xff0c;Person p1&#xff0c;写出Person类和Stu类的特殊成员函数&#xff0c;并写一个Stu的show函数&#xff…...

pytest 的 fixture 固件机制

一、前置说明 固件(fixture)是一些函数,pytest 会在执行测试函数之前(或之后)加载运行它们。pytest 使用 fixture 固件机制来实现测试的前置和后置操作,可以方便地设置和共享测试环境。 二、操作步骤 1. 编写测试代码 atme/demos/demo_pytest_tutorials/test_pytest_…...

分布式技术之分布式计算Stream模式

文章目录 什么是 Stream&#xff1f;Stream 工作原理Storm 的工作原理 实时性任务主要是针对流数据的处理&#xff0c;对处理时延要求很高&#xff0c;通常需要有常驻服务进程&#xff0c;等待数据的随时到来随时处理&#xff0c;以保证低时延。处理流数据任务的计算模式&#…...

2023年12月GESP Python五级编程题真题解析

【五级编程题1】 【试题名称】&#xff1a;小杨的幸运数 【问题描述】 小杨认为&#xff0c;所有大于等于a的完全平方数都是他的超级幸运数。 小杨还认为&#xff0c;所有超级幸运数的倍数都是他的幸运数。自然地&#xff0c;小杨的所有超级幸运数也都是幸运数。 对于一个…...

做ppt的模板的网站/如何做网站平台

新智元报道 来源&#xff1a;arxiv编辑&#xff1a;大明【新智元导读】英特尔的研究人员提出一种新的自动算法生成器(AAD)&#xff0c;利用演化算法框架&#xff0c;以Python语言的基本子集作为语法架构&#xff0c;能够对29个数组/向量问题的代码块进行组合&#xff0c;通过学…...

做最好的网站/seo优化视频教程

在 Hive SQL 中可以使用 substr() 函数来切割字段的前七位。示例语句如下&#xff1a; SELECT substr(column_name, 1, 7) FROM table_name;column_name 是需要切割的字段名称1 是开始切割的位置&#xff0c;从 1 开始7 是切割的长度 你也可以使用表达式作为第一个参数&#xf…...

做电影网站算侵权吗/自助建站系统个人网站

1. Introduction大梵天创造世界的时候做了三根柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定&#xff0c;在小圆盘上不能放大圆盘&#xff0c;在三根柱子之间一次只能移动一…...

wordpress cdn 阿里/深圳企业网站制作

LaTeX 中插入图片使其不跑到每页的开头而紧跟插入的文字之后。 此次建模过程中&#xff0c;遇到的一个比较棘手的问题是&#xff1a; 当插入图片时&#xff0c;图片的位置总是会自动跑到当页&#xff08;或下一页&#xff09;的最上方&#xff0c;而不是紧跟在其对应的说明文字…...

深圳宝安网站建设/宁波seo外包推广

Python异常处理中try与except用法的案例发布时间&#xff1a;2020-11-03 09:44:36来源&#xff1a;亿速云阅读&#xff1a;85作者&#xff1a;小新小编给大家分享一下Python异常处理中try与except用法的案例&#xff0c;希望大家阅读完这篇文章后大所收获&#xff0c;下面让我们…...

90后做网站/seo关键词排名优化的方法

将Django项目部署在LAMP/LNMP平台上,用于真正的生产环境,需要注意一下两点:数据库编码1. 数据库创建 CREATE DATABASE test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 2. 数据库设置 /etc/my.cnf [client] default-character-setutf8 [mysqld] character-set-serve…...