如何实现订单的超时15分钟关闭【案例学习】

【文章序言】:很高兴能在这篇博客与你相遇,博客记录自己的成长,进步,欢迎沟通交流。

博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!

吾等采石之人,应怀大教堂之心,愿我们奔赴在各自的热爱里…

在这里插入图片描述

要在Java中实现订单超时15分钟后自动关闭的功能,可以采用以下几种常见方法。这些方法都旨在确保在订单创建后的指定时间段(本例中为15分钟)内未完成支付的情况下,系统能够准确地识别并自动执行订单取消操作。

1、定时轮询数据库

启动一个定时任务(如使用ScheduledExecutorService或第三方定时任务框架如Quartz、Spring Scheduler等)。定时任务按照预设的时间间隔(例如每分钟一次)查询订单表中创建时间距今已超过15分钟且状态仍为待支付的订单。查询到符合条件的订单后,调用相应服务或方法进行订单取消操作,更新其状态及相关的库存、退款等业务逻辑。

  • 优点:实现简单,对现有系统改动较小。
  • 缺点:实效性取决于轮询间隔,可能导致订单关闭有延迟(最大延迟等于轮询间隔)。高并发场景下频繁查询数据库可能带来性能压力。对数据库依赖性强,若数据库连接出现问题,可能导致超时订单无法及时处理。

2、基于消息队列的延迟消息

在订单创建时,将一个带有订单ID和超时时间(当前时间+15分钟)的延迟消息发送到支持延迟投递的消息队列(如RabbitMQ的DelayedMessage Exchange、RocketMQ的定时消息、AWS SQS的延迟队列等)。当消息队列到达指定时间后,将消息投递给消费者服务。消费者服务接收到消息后,根据订单ID查询订单状态,若仍为待支付,则执行取消操作。

  • 优点:实时性好,消息队列会在精确的时间点触发订单检查。减轻数据库压力,无需频繁轮询。 解耦系统组件,增强系统的可扩展性和健壮性。
  • 缺点:需要引入额外的消息队列服务,增加系统复杂性。增加了分布式事务处理的需求,确保订单创建与消息发送的一致性。

首先,你需要引入相关的依赖,如下所示:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

接下来,你需要在Spring Boot的配置文件中配置消息队列相关的信息,如RabbitMQ的连接信息、交换机、队列等,示例配置如下:

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    
order:
  exchange: order-exchange
  queue: order-queue
  routing-key: order-routing-key

然后,创建一个订单服务类,并注入RabbitTemplate和延迟队列消息的交换机、队列、路由键等参数,示例代码如下:

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class OrderService {
    @Autowired
    private AmqpTemplate rabbitTemplate;
    
    @Value("${order.exchange}")
    private String exchange;
    
    @Value("${order.queue}")
    private String queue;
    
    @Value("${order.routing-key}")
    private String routingKey;
    
    public void createOrder(Order order) {
        // 保存订单到数据库
        
        // 发送延迟消息到队列
        rabbitTemplate.convertAndSend(exchange, routingKey, order, message -> {
            // 设置消息的延迟时间,单位为毫秒
            message.getMessageProperties().setExpiration("900000"); // 15分钟
            return message;
        });
    }
    
    public void closeOrder(Order order) {
        // 关闭订单逻辑
        System.out.println("关闭订单:" + order.getId());
    }
}

最后,创建一个消息消费者类,并监听延迟队列中的消息,示例代码如下:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class OrderConsumer {
    @Autowired
    private OrderService orderService;
    
    @RabbitListener(queues = "${order.queue}")
    public void processOrder(Order order) {
        // 处理订单逻辑
        System.out.println("处理订单:" + order.getId());
        
        // 关闭订单
        orderService.closeOrder(order);
    }
}

以上是一个简单的使用RabbitMQ实现订单超时关闭的示例代码,你可以根据实际情况进行适当的修改和优化。


在这里插入图片描述


📖☕️🌊📝📚🎩🚀
📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤️ 分享👥 留言💬thanks!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员可乐丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值