您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Spring Boot中实现订单30分钟自动取消的策略思路及源代码

时间:2023-11-20 14:29:12  来源:今日头条  作者:定时任务

方式一:使用定时任务

  • 首先,创建一个定时任务,比如每30分钟执行一次检查订单是否需要取消的逻辑。
  • 在订单生成的时候,保存一条记录到数据库,标记订单的状态为"待处理"。
  • 在定时任务中,查询出所有待处理的订单,检查当前时间距离订单生成时间是否超过了30分钟。
  • 如果超过了30分钟,则将订单状态标记为"已取消",否则不做任何操作。

代码实现如下:

首先,我们定义一个实体类Order,包含基本信息以及订单的创建时间:

@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    // 其他字段...
    
    private LocalDateTime createdTime;
}

然后,我们定义一个定时任务类,用于定时查询并取消过期的订单:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class OrderCancellationTask {
    
    @Scheduled(fixedRate = 30 * 60 * 1000)  // 每30分钟执行一次
    public void cancelExpiredOrders() {
        // 在这里编写查询并取消过期订单的逻辑...
    }
}

接下来,我们可以在定时任务中编写查询并取消过期订单的逻辑。首先,使用JPA查询出所有待处理的订单:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import JAVA.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class OrderService {
    @Autowired
    private OrderRepository orderRepository;
    
    // ...其他方法...
    
    public List<Order> findOrdersToCancel() {
        LocalDateTime三十分钟前 = LocalDateTime.now().minusMinutes(30);  // 当前时间30分钟前的时间戳
        return orderRepository.findByStatusAndCreatedTimeBefore(OrderStatus.PENDING,三十分钟前);  // 查询出所有待处理且创建时间早于30分钟前的订单
    }
}

然后,我们可以将查询出的过期订单的状态修改为"已取消":

@Service
public class OrderService {
    // ...其他方法...
    
    public void cancelOrders(List<Order> orders) {
        orders.forEach(order -> {  // 对每个查询出的订单进行处理
            order.setStatus(OrderStatus.CANCELED);  // 将订单状态修改为"已取消"
            orderRepository.save(order);  // 保存修改后的订单到数据库
        });
    }
}

最后,我们在定时任务中调用OrderService的cancelOrders方法,将查询出的过期订单的状态修改为"已取消":

@Component
public class OrderCancellationTask {
    @Autowired
    private OrderService orderService;
    
    @Scheduled(fixedRate = 30 * 60 * 1000)  // 每30分钟执行一次
    public void cancelExpiredOrders() {
        List<Order> orders = orderService.findOrdersToCancel();  // 查询出所有待处理的过期订单
        orderService.cancelOrders(orders);  // 将过期订单的状态修改为"已取消"并保存到数据库
    }
}

方式二:使用超时时间戳对比

在生成订单的时候,我们给订单增加一个超时时间戳字段。该字段表示订单可以允许被取消的时间。超过这个时间后,即不可再对订单进行取消操作。当尝试对过期订单进行取消操作时,我们会对比当前时间和这个超时时间戳。如果当前时间早于超时时间戳,则说明该订单已经过期,无法再被取消。如果当前时间晚于超时时间戳,则说明该订单还未过期,可以进行取消操作。这种方式相较于定时任务更加精确和高效。

首先,我们需要在订单类中添加一个表示超时时间戳的字段。这个字段将在订单生成时设定一个未来的时间点,表示订单可以取消的时间上限。

import java.time.LocalDateTime;

@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    // 其他字段...

    private LocalDateTime cancelTimestamp;  // 超时时间戳

    // 省略getter和setter...
}

接下来,我们需要一个服务类来处理订单的取消操作。这个服务类会检查订单是否过期,如果订单过期,那么就取消订单。

import org.springframework.stereotype.Service;

@Service
public class OrderCancellationService {
    public void cancelOrder(Order order) {
        if (isOrderExpired(order)) {
            // 订单已经过期,无法取消
            System.out.println("订单已过期,无法取消。");
        } else {
            // 订单未过期,可以进行取消操作
            System.out.println("订单取消成功。");
            // 在这里编写实际的取消操作逻辑...
        }
    }

    private boolean isOrderExpired(Order order) {
        return LocalDateTime.now().isAfter(order.getCancelTimestamp());
    }
}

在这个示例中,cancelOrder方法用于尝试取消订单。它首先调用isOrderExpired方法来检查订单是否过期。如果订单已经过期,那么就输出一条消息表示无法取消。否则,就进行实际的取消操作(在这个示例中只是输出一条成功消息,你需要根据实际情况来编写取消操作的代码)。

isOrderExpired方法用于检查订单是否过期。它比较当前时间和订单的超时时间戳,如果当前时间晚于超时时间戳,那么就表示订单已经过期。

你需要将这个示例中的订单类和Service类添加到你的项目中,并且配置好Spring和其他必要的依赖。同时,根据你的实际需求来调整超时时间戳的设定逻辑和取消操作的实现。



Tags:Spring Boot   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
Spring Boot中实现订单30分钟自动取消的策略思路及源代码
方式一:使用定时任务 首先,创建一个定时任务,比如每30分钟执行一次检查订单是否需要取消的逻辑。 在订单生成的时候,保存一条记录到数据库,标记订单的状态为"待处理"。 在定时任...【详细内容】
2023-11-20  Tags: Spring Boot  点击:(0)  评论:(0)  加入收藏
Spring Boot + Vue3 前后端分离 实战wiki知识库系统
下栽の地止:https://www.itwangzi.cn/2508.html Spring Boot + Vue3 前后端分离 实战wiki知识库系统在当今的Web应用开发中,前后端分离已经成为了一种主流的开发模式。Spring...【详细内容】
2023-11-18  Tags: Spring Boot  点击:(0)  评论:(0)  加入收藏
Spring Boot中CORS问题及解决办法,源码解析
CORS(跨源资源共享)是一种Web标准,允许来自不同源的Web页面共享资源。在Spring Boot应用程序中,CORS问题可能会出现,因为浏览器会阻止来自不同源的请求。默认情况下,Spring Boot允...【详细内容】
2023-11-01  Tags: Spring Boot  点击:(22)  评论:(0)  加入收藏
认识一些常见的Spring Boot内置Health Indicator
这一系列课程将包含Spring Boot 许多关键的技术和工具,包括 Mybatis-Plus、Redis、Mongodb、MinIO、Kafka、MySQL、消息队列(MQ)、OAuth2 等相关内容。认识一些常见的Spring Bo...【详细内容】
2023-10-27  Tags: Spring Boot  点击:(29)  评论:(0)  加入收藏
Spring Boot的自动配置原理及示例说明
这一系列课程将包含Spring Boot 许多关键的技术和工具,包括 Mybatis-Plus、Redis、Mongodb、MinIO、Kafka、MySQL、消息队列(MQ)、OAuth2 等相关内容。Spring Boot的自动配置原...【详细内容】
2023-10-18  Tags: Spring Boot  点击:(53)  评论:(0)  加入收藏
用 Arthas 定位 Spring Boot 接口的超时问题,让应用起飞
一、背景公司有个渠道系统,专门对接三方渠道使用,没有什么业务逻辑,主要是转换报文和参数校验之类的工作,起着一个承上启下的作用。最近在优化接口的响应时间,优化了代码之后,但是...【详细内容】
2023-10-17  Tags: Spring Boot  点击:(45)  评论:(0)  加入收藏
使用JIB插件轻松实现Spring Boot应用容器化
在微服务架构中,构建Docker镜像是必不可少的。然而,构建Docker镜像并不是一项容易的任务。通常情况下,需要先了解Docker的知识,编写Dockerfile,然后运行Docker守护程序来构建和发...【详细内容】
2023-10-16  Tags: Spring Boot  点击:(46)  评论:(0)  加入收藏
Spring BOOT 启动参数
Spring BOOT 启动参数在Java Web的开发完成后,以前我们都会打包成war文件,然后放大web容器,比如tomcat、jetty这样的容器。现在基于SpringBoot开发的项目,我们直接打包成jar文件...【详细内容】
2023-10-10  Tags: Spring Boot  点击:(46)  评论:(0)  加入收藏
Spring Boot宣布支持Java 21:开发者的福音与挑战
近期的更新中,SpringBoot宣布已经支持Java21,这是一个令开发者们兴奋的消息。Java21是最新的Java版本,带来了许多新的功能和改进,使得开发过程更加高效和方便。SpringBoot作为一...【详细内容】
2023-10-08  Tags: Spring Boot  点击:(96)  评论:(0)  加入收藏
三个要点,掌握Spring Boot单元测试
单元测试是软件开发中不可或缺的重要环节,它用于验证软件中最小可测试单元的准确性。结合运用Spring Boot、JUnit、Mockito和分层架构,开发人员可以更便捷地编写可靠、可测试...【详细内容】
2023-09-28  Tags: Spring Boot  点击:(45)  评论:(0)  加入收藏
▌简易百科推荐
Spring Boot中实现订单30分钟自动取消的策略思路及源代码
方式一:使用定时任务 首先,创建一个定时任务,比如每30分钟执行一次检查订单是否需要取消的逻辑。 在订单生成的时候,保存一条记录到数据库,标记订单的状态为"待处理"。 在定时任...【详细内容】
2023-11-20  定时任务  今日头条  Tags:Spring Boot   点击:(0)  评论:(0)  加入收藏
无缝集成GORM与Go Web框架
探索GORM与流行的Go Web框架之间的和谐集成,以实现高效的数据管理高效的数据管理是每个成功的Web应用程序的基础。GORM,多才多艺的Go对象关系映射库,与流行的Go Web框架非常搭...【详细内容】
2023-11-17  技术的游戏  微信公众号  Tags:框架   点击:(5)  评论:(0)  加入收藏
前端框架的演进与未来展望
自从前后端分离的概念被提出以来,前端框架的发展就如同百花齐放,呈现出一片繁荣景象。最早出现的是Angular,随后又有了React 和Vue,而如今,Vue和 React已经成为了前端开发的主宰...【详细内容】
2023-11-17    奋斗吧我的人生  Tags:框架   点击:(9)  评论:(0)  加入收藏
.NET Core下有热门的ORM框架使用方法
.NET Core下有很多热门的ORM框架,以下是其中六个常用的框架,包括EF Core、Dapper、NHibernate、Fluent NHibernate、LLBLGen Pro和PetaPoco。接下来,我将为您详细介绍每个框架...【详细内容】
2023-11-16      Tags:ORM框架   点击:(10)  评论:(0)  加入收藏
LLMs应用框架:LangChain端到端语言模型
在当今数字化时代,语言处理技术的重要性日益凸显。大语言模型(LLMs)作为其中的重要分支,已经在多个领域取得了显著的进展。然而,如何将这些模型应用到实际场景中,实现端到端的自动...【详细内容】
2023-11-16  王炸无人机飞手    Tags:LLMs   点击:(4)  评论:(0)  加入收藏
如何实现SpringCloud全链路灰色发布?
灰度发布(Gray Release,也称为灰度发布或金丝雀发布)是指在软件或服务发布过程中,将新版本的功能或服务以较小的比例引入到生产环境中,仅向部分用户或节点提供新功能的一种发布策...【详细内容】
2023-11-14  Java面试真题解析  微信公众号  Tags:SpringCloud   点击:(13)  评论:(0)  加入收藏
.NET Core中一些优秀的项目和框架
.NET Core是一个跨平台的开源框架,它可以用来构建Web应用程序、微服务、桌面应用程序和游戏等。它具有高性能、可扩展性和安全性等优点,因此越来越多的企业和开发者选择使用.N...【详细内容】
2023-11-13  架构师老卢  今日头条  Tags:框架   点击:(28)  评论:(0)  加入收藏
常用消息队列框架与技术选型
又是一年双11季,土豪们买买买,程序员看看热闹,聊聊技术。海量的订单、支付请求以及库存更新等任务,离不开分布式架构(SOFAStack)、分布式数据库(OceanBase)、分布式缓存(Tair)、数据处...【详细内容】
2023-11-13    今日头条  Tags:框架   点击:(14)  评论:(0)  加入收藏
Centos7下安装部署RabbitMQ,看这篇就够了
前言RabbitMQ是一个开源的强大的企业消息系统,支持主流的操作系统,支持多种开发语言。我们项目中使用RabbitMQ作为消息队列,解耦业务,构建高可靠的消息队列系统。RabbitMQ可以...【详细内容】
2023-11-09  海洋的渔夫    Tags:RabbitMQ   点击:(13)  评论:(0)  加入收藏
一文带你了解Spring Actuator
服务监控Spring Boot Actuator是一个用于监控和管理Spring Boot应用的子项目,它提供了一组REST端点和命令行工具, 用于查看应用的运行状态、性能指标和健康状况等。Actuator还...【详细内容】
2023-11-08  Java技术指北  微信公众号  Tags:Spring   点击:(20)  评论:(0)  加入收藏
站内最新
站内热门
站内头条