在SpringBoot项目中,实现订单超过24小时过期并自动关单,常见有以下几种方案,我会逐一说明,并给出推荐实现:
✅ 推荐方案:使用 延迟队列(DelayQueue) 或 消息队列(如RabbitMQ延迟消息)
方案1:使用 Redis + 延迟队列(Redisson延迟队列)
优点: 高性能、易扩展、适合分布式系统
实现步骤:
实现步骤:
-
引入Redisson依赖:
xml
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.4</version>
</dependency>
-
下单时,将订单ID加入延迟队列,延迟时间为24小时:
java
RDelayedQueue<String> delayedQueue = redissonClient.getDelayedQueue("orderDelayQueue");
delayedQueue.offer(orderId, 24, TimeUnit.HOURS);
-
启动一个监听线程,消费延迟队列:
java
RQueue<String> queue = redissonClient.getQueue("orderDelayQueue");
RDelayedQueue<String> delayedQueue = redissonClient.getDelayedQueue(queue);new Thread(() -> {while (true) {try {String orderId = queue.take(); // 阻塞等待过期订单// 查询订单状态,如果未支付,则关单Order order = orderService.getById(orderId);if (order != null && "UNPAID".equals(order.getStatus())) {orderService.closeOrder(orderId);log.info("订单已关闭:{}", orderId);}} catch (InterruptedException e) {Thread.currentThread().interrupt();break;}}
}).start();